参考资料:
https://www.cnblogs.com/lewis0077/p/5133812.html
https://www.imooc.com/learn/165
策略模式代码实践
目录
1、什么是策略模式
2、策略模式结构
3、策略模式如何实现
4、策略模式优缺点
5、策略模式特点
6、策略模式作用
7、策略模式应用场景
8、理解组合
9、为什么组合是优于继承的一个选择呢
10、理解开闭原则
11、策略模式中的设计原则
12、策略和上下文的关系
13、扩展上下文的实现
1、什么是策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。
2、策略模式结构
1).策略接口角色IStrategy: 用来约束一系列具体的策略算法,策略上下文角色ConcreteStrategy使用此策略接口来调用具体的策略所实现的算法。
2).具体策略实现角色ConcreteStrategy:具体的策略实现,即具体的算法实现。
3).策略上下文角色StrategyContext:策略上下文,负责和具体的策略实现交互,通常策略上下文对象会持有一个真正的策略实现对象,策略上下文还可以让具体的策略实现从其中获取相关数据,回调策略上下文对象的方法。
3、策略模式如何实现
(1)通过分离变化得出的策略接口Strategy;
(2)Strategy的实现类;
(3)客户程序有一个Strategy;
(4)在客户程序中选择/组装正确的Strategy实现;
4、策略模式优缺点
优点:
(1)使用了组合,使架构更加灵活;
(2)富有弹性,可以较好的应对变化(开闭原则)
(3)更好的代码复用性(相对于继承)
(4)消除大量的条件语句
其他总结:
策略模式的优点:
1).策略模式的功能就是通过抽象、封装来定义一系列的算法,使得这些算法可以相互替换,所以为这些算法定义一个公共的接口,以约束这些算法的功能实现。如果这些算法具有公共的功能,可以将接口变为抽象类,将公共功能放到抽象父类里面。
2).策略模式的一系列算法是可以相互替换的、是平等的,写在一起就是if-else组织结构,如果算法实现里又有条件语句,就构成了多重条件语句,可以用策略模式,避免这样的多重条件语句。
3).扩展性更好:在策略模式中扩展策略实现非常的容易,只要新增一个策略实现类,然后在使用策略实现的地方,使用这个新的策略实现就好了。
缺点:
(1) 客户代码需要了解每个策略实现的细节;
(2) 增加了对象的数目;
其他总结:
策略模式的缺点:
1).客户端必须了解所有的策略,清楚它们的不同:
如果由客户端来决定使用何种算法,那客户端必须知道所有的策略,清楚各个策略的功能和不同,这样才能做出正确的选择,但是这暴露了策略的具体实现。
2).增加了对象的数量:
由于策略模式将每个具体的算法都单独封装为一个策略类,如果可选的策略有很多的话,那对象的数量也会很多。
3).只适合偏平的算法结构:
由于策略模式的各个策略实现是平等的关系(可相互替换),实际上就构成了一个扁平的算法结构。即一个策略接口下面有多个平等的策略实现(多个策略实现是兄弟关系),并且运行时只能有一个算法被使用。这就限制了算法的使用层级,且不能被嵌套。
5、策略模式特点
1)不变更代码框架,通过开发重构虚拟的应用;
2)使用策略模式,拥抱需求的变化;
3)策略模式的着重点:不是如何来实现算法,而是如何组织和调用这些算法,从而让我们的程序结构更加的灵活、可扩展。
6、策略模式作用
把具体的算法实现从业务逻辑中剥离出来,成为一系列独立算法类,使得它们可以相互替换。
7、策略模式应用场景
(1)许多相关的类仅仅是行为差异;
(2)运行时选取不同的算法变体;
(3)通过条件语句在多个分支中选取
8、理解组合
在类中增加一个私有域,引用另一个已有的类的实例,通过调用引用实例的方法从而获得新的功能,这种设计被称为组合(复合);
9、为什么组合是优于继承的一个选择呢
10、理解开闭原则
-
对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
-
对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。
11、策略模式中的设计原则
(1)找出应用中需要变化的部分,把他们独立出来,不要和哪些不需要变化的代码混在一起;
(2)将不变的东西抽象成接口,将变化的东西交给实现去做;
(3)接口为我们提供了一个契约,在总体上规定了双方的行为框架,再通过多态的特性用不同的实现类展现了世界的多样性;
(4)多用组合,少用继承;
12、策略和上下文的关系
在策略模式中,一般情况下都是上下文持有策略的引用,以进行对具体策略的调用。但具体的策略对象也可以从上下文中获取所需数据,可以将上下文当做参数传入到具体策略中,具体策略通过回调上下文中的方法来获取其所需要的数据。
13、扩展上下文的实现
优点:
具体的策略实现风格很是统一,策略实现所需要的数据都是从上下文中获取的,在上下文中添加的数据,可以视为公共的数据,其他的策略实现也可以使用。
缺点:
很明显如果某些数据只是特定的策略实现需要,大部分的策略实现不需要,那这些数据有“浪费”之嫌,另外如果每次添加算法数据都扩展上下文,很容易导致上下文的层级很是复杂。
在具体的策略实现上添加所需要的数据的实现:
优点:容易想到,实现简单
缺点:与其他的策略实现风格不一致,其他的策略实现所需数据都是来自上下文,而这个策略实现一部分数据来自于自身,一部分数据来自于上下文;外部在使用这个策略实现的时候也和其他的策略实现不一致了,难以以一个统一的方式动态的切换策略实现。
网友评论