策略模式实战中多种写法

实战1

通过SpringContextAware.getBean(“Bean名称”)方式

需求说明

广告投放中,当用户点击广告的时候,平台(头条,快手等)都会回调给我们监测链接数据(广告创意,广告计划,用户的设备信息androdid,imei,oaid,idfa等),然后我们需要把监测链接的数据保存进表并根据用户的设备信息(androdid,imei,oaid,idfa)缓存起来,但是不同的平台的监测链接的字段是不同的,缓存的方式也可能不同。我们为每个平台都创建了一个service,这些service都同时implements接口ISpreadService接口,又因为每个平台的数据都需要缓存和插入数据库,于是又把这些service同时实现一个抽象类AbastractSpreadService,同时使用泛型T来代表不同平台的Vo。

外层Controller

策略模式实战中多种写法

接口类ISPreadService

策略模式实战中多种写法

抽象类AbastractSpreadService

 注意抽象类没有实现接口的class()方法,而是让实现抽象类的子类实现各自的class()方法。

doCache()方法是抽象方法,让实现抽象类的子类自己实现。

策略模式实战中多种写法

平台“今日头条”实现类

策略模式实战中多种写法

抽象类实现接口的原因

1.一般而言,多使用普通类来实现接口,但是普通类实现接口的话就必须实现接口的所有方法,这样容易造成代码冗余。

2.而如果使用抽象类来实现接口,然后再用普通类继承抽象类的话,普通类仍然可以实现接口中但抽象类中并未实现的方法。以此可以只实现必要的方法,即抽象类中可以不定义对于子类而言必要的方法,而最终交由子类自己来实现。

3.抽象类实现接口时,不必实现接口中的所有方法,未实现的方法可以交由子类自己来实现。

实战2

使用SpringContextAware.getBeansOfType(接口类)的方式

需求说明

抖店订单推送中,订单类型有很多,每种类型的处理方式不同。

策略模式实战中多种写法

 外层Controller

策略模式实战中多种写法

Service类

 策略模式实战中多种写法

 实战3

implements ApplicationContextAware接口的方式,ApplicationContextAware的执行时机,涉及Bean的生命周期,详细介绍请查看我的另一篇文章——Spring--Bean相关中生命周期的内容

需求说明

借贷的需求中,用户获取授权code,用户下单成功,用户资金匹配失败,用户资金匹配成功

以上四种类型都通过同一个接口回调,根据请求参数中type字段区分

Controller层

策略模式实战中多种写法

Controller层中的callBack()方法

以上4中回调的签名和验签都是一样的

策略模式实战中多种写法

Service实现ApplicationContextAware接口

策略模式实战中多种写法

策略类

策略模式实战中多种写法

实现类继承策略类

策略模式实战中多种写法

实战4

实现 InitializingBean接口的方式,其中InitializingBean的执行时机,涉及Bean的生命周期,详细介绍请查看我的另一篇文章——Spring--Bean相关中生命周期的内容。

需求跟实战1相同,只是用kotlin重构了一遍

Service实现 InitializingBean接口

实现 InitializingBean接口必须实现afterPropertiesSet方法。

策略模式实战中多种写法

InitializingBean源码

策略模式实战中多种写法

重写afterPropertiesSet()方法

 策略模式实战中多种写法

 

上一篇:spring初始化bean的两种方式


下一篇:Spring中的InitializingBean接口