策略模式与工厂模式的结合使用

简介:

策略模式:

定义了一组算法(业务规则);

封装了每个算法;

这族的算法可互换代替(interchangeable)。

组成:

         抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

         具体策略角色:包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端调用。

策略模式与工厂模式的结合使用

 

实操代码:

1、定义策略抽象类:

策略模式与工厂模式的结合使用

 

2、自定义注解:

         为了方便比对传入的场景值,选择对应的策略处理类,定义一个运行时注解

策略模式与工厂模式的结合使用

 

3、定义对应的策略处理接口:

         就是真正处理执行巡检点位的实现,它们是要继承策略抽象类的;

         可见光执行策略如下:

        策略模式与工厂模式的结合使用

 

 

策略模式与工厂模式的结合使用

策略模式与工厂模式的结合使用

这里的@ItemAnnotation就是上面自定义的注解,CameraType是自定义的常量,对应场景值,作用是根据不同场景值,执行不同的行为。

策略模式与工厂模式的结合使用

 

4、根据场景值选择对应的处理类:

         结合工厂模式,在程序启动时,采用@PostConstruct注解,将实现BaseItemStrategy抽象类的所有策略类都加载到内存中了,根据不同场景值,选择对应的处理类,全部代码如下:

策略模式与工厂模式的结合使用

 

所有的策略类都写完,看下如何使用。

5、如何使用:

策略模式与工厂模式的结合使用

        

如果后续需要新增其他的巡检项点位执行模式,那就只需要新增一个处理类,新增一个对应的场景值就可以了,对原有代码不侵入。

总结:

策略模式的主要优点如下

策略模式提供了对 “开闭原则” 的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。

策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族,恰当使用继承可以把公共的代码移到抽象策略类中,从而避免重复的代码。

策略模式提供了一种可以替换继承关系的办法。如果不使用策略模式而是通过继承,这样算法的使用就和算法本身混在一起,不符合 “单一职责原则”,而且使用继承无法实现算法或行为在程序运行时的动态切换。

使用策略模式可以避免多重条件选择语句。多重条件选择语句是硬编码,不易维护。

策略模式提供了一种算法的复用机制,由于将算法单独提取出来封装在策略类中,因此不同的环境类可以方便地复用这些策略类。

策略模式的主要缺点如下

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

策略模式将造成系统产生很多具体策略类,任何细小的变化都将导致系统要增加一个新的具体策略类。

无法同时在客户端使用多个策略类,也就是说,在使用策略模式时,客户端每次只能使用一个策略类,不支持使用一个策略类完成部分功能后再使用另一个策略类来完成剩余功能的情况。