行为型模式之策略模式

(复习用,不适合初学。复习用,不适合初学。复习用,不适合初学。)

  1. 定义(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。(Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

  2. 角色:

    ①Context(环境类)

    环境类是使用算法的角色,他在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维护一个对抽象策略类的引用实例,用于定义所采用的策略。

    ②Strategy(抽象策略类)

    抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类,他可以是抽象类,也可以是接口。环境类使用在其中声明的方法调用在具体策略类中实现的算法。

    ③ConcreteStrategy(具体策略类)

    具体策略类实现了在抽象策略类中定义的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略对象,使用一种具体的算法实现某个业务处理。

  3. 解决方案(类图)

    策略模式类图

  4. 优缺点

    ①优点:

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

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

    (3)策略模式提供了可以替换继承关系的方法。继承可以处理多种算法或行为,如果不适用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用就和算法或行为本身混在一起,不符合“单一职责原则“,决定使用哪一种算法或采取哪一种行为的逻辑和算法或行为本身的逻辑混合在一起,从而不可能再独立演化,而且使用继承无法实现算法或行为的动态改变。

    (4)使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件转移语句里面,比使用继承的办法还要原始和落后。

    ②缺点:

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

    (2)策略模式将造成产生很多策略类的对象,可以通过使用享元模式在一定程度上减少对象的数量。

  5. 适用环境

    ①如果在一个系统里面有许多类,它们之间的区别仅仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

    ②一个系统需要动态地在几种算法中选择一种,那么可以将这些算法封装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。

    ③如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

    ④不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性和安全性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值