策略模式

作者: greensure | 来源:发表于2019-01-15 12:25 被阅读0次

    参考资料:

    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、扩展上下文的实现

    优点:

    具体的策略实现风格很是统一,策略实现所需要的数据都是从上下文中获取的,在上下文中添加的数据,可以视为公共的数据,其他的策略实现也可以使用。

    缺点:

    很明显如果某些数据只是特定的策略实现需要,大部分的策略实现不需要,那这些数据有“浪费”之嫌,另外如果每次添加算法数据都扩展上下文,很容易导致上下文的层级很是复杂。

    在具体的策略实现上添加所需要的数据的实现:

    优点:容易想到,实现简单

    缺点:与其他的策略实现风格不一致,其他的策略实现所需数据都是来自上下文,而这个策略实现一部分数据来自于自身,一部分数据来自于上下文;外部在使用这个策略实现的时候也和其他的策略实现不一致了,难以以一个统一的方式动态的切换策略实现。

    相关文章

      网友评论

        本文标题:策略模式

        本文链接:https://www.haomeiwen.com/subject/fuaedqtx.html