策略模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• AWT中的LayoutManager
java.awt类库需要在运行期间动态地由客户端决定 一个Container对象怎样排列它所有的GUI组件。 Java语言提供了几种不同的排列方式,包装在不 同的类里: •BorderLayout •FlowLayout •GridLayout •GridBagLayout •CardLayout
策略模式简略类图
策略模式的实现步骤
• 1、定义抽象角色类,定义好各个实现的共 同抽象方法; • 2、定义具体策略类,具体实现父类的共同 方法; • 3、定义环境角色类,私有化申明抽象角色 变量,重载构造方法,执行抽象方法。
策略模式的结构
• 策略模式的类图:
这其中涉及到三个角色: • 环境(Context)角色:持有一个Strategy类的引用。 • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实 现。此角色给出所有的具体策略类所需的接口。 • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
• 与享元(Flyweight Pattern)的关系
享元模式类图
如果有多个客户端对象需要调用同样的一些策略类的 话,就可以使它们实现享元模式,这样客户端可以共 享这些策略类。可组合使用。
• 与桥梁(Bridge)模式的关系
两种模式结构图比较
策略模式是一个行为模式,旨在封装一系列的行为 (自由切换算 法) 桥梁模式则是解决在不破坏封装的情况下如何抽取出它的抽象部 分和实现部分(独立扩展)
(2)策略模式造成很多的策略类 (3)只适合扁平的算法结构,不适合于处理 同时嵌套多于一个算法的情形。
装饰模式 享元模式 工厂方法模式 门面模式
策略模式与其他模式的关系
• 与建造者(Builder)模式的关系
二者结构上相似。事实上建造模式 是策略模式的一种特殊情况。 这两种模式之间的区别是它们用意 不同。 建造者模式中,核心功能是一步一 步的方式创立一个产品,它的 Director角色一遍一遍调用建造者对 象来把零件增加到产品上,最后返 还整个产品对象。 策略模式,Strategy角色在Context 角色的调用下,不仅可以提供新对 象的创立,还可以提供任何一种服 务。
• 环境角色类持有一个对策略角色的引用。其源代码:
• 抽象策略类规定所有具体策略略必须实现的接口。其源代 码:
• 具体策略类实现了抽象策略类所声明的接口。其源代码:
• 一般而言,有意义的策略模式的应用都会涉 及到多于一个的具体策略角色。这里只给出 了一个具体策略类,是策略模式的最小实现。
Java语言内部的例子
• 环境(Context)角色:由 Container类扮演。 • 抽象策略(Strategy)角色: 由LayoutManager类扮演。 此类角色给出所有的具体 Layout类所需的接口。 • 具体策略(ConcreteStrategy) 角色:由 BorderLayout,FlowLayout,Gr idLayout,GridBag,CardLayou t等扮演,它们包装了不同的 Layout行为。
三种解决方案:
• 所有的业务逻辑都放在客户端里面。客户端利用 条件选择语句决定使用哪一个算法。但是这样, 客户端代码会变得复杂和难以维护。 • 客户端可以利用继承的办法在子类里面实现不同 的行为。但是这样使得环境和行为紧密耦合在一 起。强耦合会使这二者不能单独演化。 • 使用策略模式。策略模式把行为和环境分割开来。 环境类负责维持和查询行为类,各种算法则在具 体策略类中提供。由于算法和环境独立开来,算 法的增减、修改都不会影响环境和客户端。
• 与装饰(Decorator)模式的关系
装饰模式的用意在于不改变 接口的情况下,增强一个对 象的功能。 策略模式在保持接口不变的 情况下,使具体算法可以互 换。策略模式只能处理客户 端从几个具体算法中选择一 个的情形,而不能处理客户 端同时选用一种一上算法的 情形。为处理后者,可以组 合使用。
装饰模式类图
• 与模板方法(Template)模式的关系
模板方法模式结构图
模板方法模式与策略模式的不同在于,策略模式使用委派的方法提 供不同的算法行为,而模板方法模式使用继承的方法提供不同的算 法行为。 可以组合使用,模板方法重在封装算法骨架,策略模式重在分离并 封装算法的实现。
• 与状态(State)模式的关系
排序系统设计如下:
• 客户端必须决定在何时使用哪一个排序算法,换言之,这 个决定不是在模式内部决定的, 客户端需要记住各种排 序方法的名字。
解决图书折扣的计算问题
• 对前述图书销售的问题,折扣是根据以下 几个算法中的一个进行的: 算法一:对有些图书没有折扣。折扣算法 对象返还0作为折扣值。 算法二:对有些图书提供一个固定量值为1 元的折扣。 算法三:对有些图书提供一个百分比的折 扣,比如一本书价格为20元,折扣百分比 为7%,那么折扣值就是20*7%=1.4元。
策略模式Байду номын сангаас优点
(1)策略模式提供了管理相关的算法族的方 法。
定义了一系列算法,使这些算法可以相互替换, 自由切换。
(2)策略模式提供了可以替换继承关系的方 法。 (3)使用策略模式可以避免使用多重条件转 移语句。 (4)更好的扩展性
策略模式的缺点
(1)所有的策略模式都需要对外暴露
客户端必须知道所有的策略类,并自行决定使用 哪一个策略类。
• From GOF
什么是策略模式
• 策略模式是对算法的包装,是把使用算法的责任和 算法本身分割开,委派给不同的对象管理。 • 策略模式通常把一个系统的算法包装到一系列的策 略类里面,作为一个抽象策略类的子类。 • 策略模式的用意在于把可选的策略或方案封装在不 同的类中,并在这些类中实现一个共同的操作。
建造者模式类图
• 与适合器(Adapter)模式的关系
左边是类的适配器模式,右边是对象的适配器模式
二者在结构上相似。它们的区别在于它们的用意不同。 适配器模式的用意是允许一个客户对象通过调用一个配备着 完全不同的接口的对象来完成它原来所要做的功能。 策略模式的用意是使用统一的接口为客户端提供不同的算法。
对象行为型模式
策略模式
刘备江东娶老婆, 赵云伤不起啊~~!!
一、引子
• 假设现在要设计一个贩卖各类书籍的电子商务网 站的购物车(Shopping Cart)系统。一个最简单 的情况就是把所有货品的单价乘上数量,但实际 情况肯定比这要复杂。比如,本网站可能对所有 的教材类图书实行每本一元的折扣;对连环画类 图书提供每本7%的促销折扣,而对非教材类的计 算机图书有3%的折扣;对其余的图书没有折扣。 由于有这样复杂的折扣算法,使得价格计算问题 需要系统地解决。 • 那么怎么解决这个问题呢?
LayoutManager的类图
一个简单的例子
• 排序策略系统
假设要设计一个排序系统(Sorter System),动 态地决定采用二元排序(Binary Sort),泡沫排 序(Bubble Sort),堆栈排序(Heap Sort), 快速排序(Quick Sort),基数排序(Radix Sort)。 采用策略模式把几种排序算法包装到不同的算法 类里面,让所有的算法都具有相同的接口。
状态模式结构图
策略模式封装不同的算法,算法之间没有交互,以达到算法自由切 换。 状态模式封装不同的状态,以达到状态切换导致行为发生改变的目 的。
设计原则的讨论
• “开—闭”原则(OCP) 对扩展开放,对修改关闭。 极好体现! • 里氏代换原则(LSP) 所有引用基类的地方必须能透明的使用其子类的 对象。基础! • 迪米特法则(LoD) 一个对象应当对其他对象有尽可能少的了解。违 背!
最佳实践
• 诸葛亮给了他三个锦囊, 囊中有三条妙计(走乔国 老的后门、求孙国太放人、 和请孙夫人退兵)嘱咐赵 云“伺机”行事。
周瑜赔了夫人又折兵!!!
我X。。这都行! 伤不起啊!! 伤不起啊!!
Q&A
引进策略模式
• 意图:
• “Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.”
系统类图
抽象折扣类DiscountStrategy
具体折扣类NoDiscountStrategy
具体折扣类FlatRateStrategy
具体折扣类PercentageStrategy
环境类Discounter
客户端Client
运行结果
使用场合
• 如果一系统里面有许多类,它们之间的区别仅在 于它们的行为,那么使用策略模式可以动态地让 一个对象在许多行为中选择一种行为。 • 一个系统需要动态地在几种算法中选择一种。那 么这些算法可以包装到一个个的具体算法类里面, 而这些具体算法类都是一个抽象算法类的子类。 • 一个系统的算法使用的数据不可以让客户端知道。 策略模式可以避免让客户端涉及到不必要接触到 的复杂的和只与算法有关的数据。 • 如果一个对象有很多种行为,如果不用恰当的模 式,这些行为就只有使用多重的条件选择语句。
java.awt类库需要在运行期间动态地由客户端决定 一个Container对象怎样排列它所有的GUI组件。 Java语言提供了几种不同的排列方式,包装在不 同的类里: •BorderLayout •FlowLayout •GridLayout •GridBagLayout •CardLayout
策略模式简略类图
策略模式的实现步骤
• 1、定义抽象角色类,定义好各个实现的共 同抽象方法; • 2、定义具体策略类,具体实现父类的共同 方法; • 3、定义环境角色类,私有化申明抽象角色 变量,重载构造方法,执行抽象方法。
策略模式的结构
• 策略模式的类图:
这其中涉及到三个角色: • 环境(Context)角色:持有一个Strategy类的引用。 • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实 现。此角色给出所有的具体策略类所需的接口。 • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
• 与享元(Flyweight Pattern)的关系
享元模式类图
如果有多个客户端对象需要调用同样的一些策略类的 话,就可以使它们实现享元模式,这样客户端可以共 享这些策略类。可组合使用。
• 与桥梁(Bridge)模式的关系
两种模式结构图比较
策略模式是一个行为模式,旨在封装一系列的行为 (自由切换算 法) 桥梁模式则是解决在不破坏封装的情况下如何抽取出它的抽象部 分和实现部分(独立扩展)
(2)策略模式造成很多的策略类 (3)只适合扁平的算法结构,不适合于处理 同时嵌套多于一个算法的情形。
装饰模式 享元模式 工厂方法模式 门面模式
策略模式与其他模式的关系
• 与建造者(Builder)模式的关系
二者结构上相似。事实上建造模式 是策略模式的一种特殊情况。 这两种模式之间的区别是它们用意 不同。 建造者模式中,核心功能是一步一 步的方式创立一个产品,它的 Director角色一遍一遍调用建造者对 象来把零件增加到产品上,最后返 还整个产品对象。 策略模式,Strategy角色在Context 角色的调用下,不仅可以提供新对 象的创立,还可以提供任何一种服 务。
• 环境角色类持有一个对策略角色的引用。其源代码:
• 抽象策略类规定所有具体策略略必须实现的接口。其源代 码:
• 具体策略类实现了抽象策略类所声明的接口。其源代码:
• 一般而言,有意义的策略模式的应用都会涉 及到多于一个的具体策略角色。这里只给出 了一个具体策略类,是策略模式的最小实现。
Java语言内部的例子
• 环境(Context)角色:由 Container类扮演。 • 抽象策略(Strategy)角色: 由LayoutManager类扮演。 此类角色给出所有的具体 Layout类所需的接口。 • 具体策略(ConcreteStrategy) 角色:由 BorderLayout,FlowLayout,Gr idLayout,GridBag,CardLayou t等扮演,它们包装了不同的 Layout行为。
三种解决方案:
• 所有的业务逻辑都放在客户端里面。客户端利用 条件选择语句决定使用哪一个算法。但是这样, 客户端代码会变得复杂和难以维护。 • 客户端可以利用继承的办法在子类里面实现不同 的行为。但是这样使得环境和行为紧密耦合在一 起。强耦合会使这二者不能单独演化。 • 使用策略模式。策略模式把行为和环境分割开来。 环境类负责维持和查询行为类,各种算法则在具 体策略类中提供。由于算法和环境独立开来,算 法的增减、修改都不会影响环境和客户端。
• 与装饰(Decorator)模式的关系
装饰模式的用意在于不改变 接口的情况下,增强一个对 象的功能。 策略模式在保持接口不变的 情况下,使具体算法可以互 换。策略模式只能处理客户 端从几个具体算法中选择一 个的情形,而不能处理客户 端同时选用一种一上算法的 情形。为处理后者,可以组 合使用。
装饰模式类图
• 与模板方法(Template)模式的关系
模板方法模式结构图
模板方法模式与策略模式的不同在于,策略模式使用委派的方法提 供不同的算法行为,而模板方法模式使用继承的方法提供不同的算 法行为。 可以组合使用,模板方法重在封装算法骨架,策略模式重在分离并 封装算法的实现。
• 与状态(State)模式的关系
排序系统设计如下:
• 客户端必须决定在何时使用哪一个排序算法,换言之,这 个决定不是在模式内部决定的, 客户端需要记住各种排 序方法的名字。
解决图书折扣的计算问题
• 对前述图书销售的问题,折扣是根据以下 几个算法中的一个进行的: 算法一:对有些图书没有折扣。折扣算法 对象返还0作为折扣值。 算法二:对有些图书提供一个固定量值为1 元的折扣。 算法三:对有些图书提供一个百分比的折 扣,比如一本书价格为20元,折扣百分比 为7%,那么折扣值就是20*7%=1.4元。
策略模式Байду номын сангаас优点
(1)策略模式提供了管理相关的算法族的方 法。
定义了一系列算法,使这些算法可以相互替换, 自由切换。
(2)策略模式提供了可以替换继承关系的方 法。 (3)使用策略模式可以避免使用多重条件转 移语句。 (4)更好的扩展性
策略模式的缺点
(1)所有的策略模式都需要对外暴露
客户端必须知道所有的策略类,并自行决定使用 哪一个策略类。
• From GOF
什么是策略模式
• 策略模式是对算法的包装,是把使用算法的责任和 算法本身分割开,委派给不同的对象管理。 • 策略模式通常把一个系统的算法包装到一系列的策 略类里面,作为一个抽象策略类的子类。 • 策略模式的用意在于把可选的策略或方案封装在不 同的类中,并在这些类中实现一个共同的操作。
建造者模式类图
• 与适合器(Adapter)模式的关系
左边是类的适配器模式,右边是对象的适配器模式
二者在结构上相似。它们的区别在于它们的用意不同。 适配器模式的用意是允许一个客户对象通过调用一个配备着 完全不同的接口的对象来完成它原来所要做的功能。 策略模式的用意是使用统一的接口为客户端提供不同的算法。
对象行为型模式
策略模式
刘备江东娶老婆, 赵云伤不起啊~~!!
一、引子
• 假设现在要设计一个贩卖各类书籍的电子商务网 站的购物车(Shopping Cart)系统。一个最简单 的情况就是把所有货品的单价乘上数量,但实际 情况肯定比这要复杂。比如,本网站可能对所有 的教材类图书实行每本一元的折扣;对连环画类 图书提供每本7%的促销折扣,而对非教材类的计 算机图书有3%的折扣;对其余的图书没有折扣。 由于有这样复杂的折扣算法,使得价格计算问题 需要系统地解决。 • 那么怎么解决这个问题呢?
LayoutManager的类图
一个简单的例子
• 排序策略系统
假设要设计一个排序系统(Sorter System),动 态地决定采用二元排序(Binary Sort),泡沫排 序(Bubble Sort),堆栈排序(Heap Sort), 快速排序(Quick Sort),基数排序(Radix Sort)。 采用策略模式把几种排序算法包装到不同的算法 类里面,让所有的算法都具有相同的接口。
状态模式结构图
策略模式封装不同的算法,算法之间没有交互,以达到算法自由切 换。 状态模式封装不同的状态,以达到状态切换导致行为发生改变的目 的。
设计原则的讨论
• “开—闭”原则(OCP) 对扩展开放,对修改关闭。 极好体现! • 里氏代换原则(LSP) 所有引用基类的地方必须能透明的使用其子类的 对象。基础! • 迪米特法则(LoD) 一个对象应当对其他对象有尽可能少的了解。违 背!
最佳实践
• 诸葛亮给了他三个锦囊, 囊中有三条妙计(走乔国 老的后门、求孙国太放人、 和请孙夫人退兵)嘱咐赵 云“伺机”行事。
周瑜赔了夫人又折兵!!!
我X。。这都行! 伤不起啊!! 伤不起啊!!
Q&A
引进策略模式
• 意图:
• “Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.”
系统类图
抽象折扣类DiscountStrategy
具体折扣类NoDiscountStrategy
具体折扣类FlatRateStrategy
具体折扣类PercentageStrategy
环境类Discounter
客户端Client
运行结果
使用场合
• 如果一系统里面有许多类,它们之间的区别仅在 于它们的行为,那么使用策略模式可以动态地让 一个对象在许多行为中选择一种行为。 • 一个系统需要动态地在几种算法中选择一种。那 么这些算法可以包装到一个个的具体算法类里面, 而这些具体算法类都是一个抽象算法类的子类。 • 一个系统的算法使用的数据不可以让客户端知道。 策略模式可以避免让客户端涉及到不必要接触到 的复杂的和只与算法有关的数据。 • 如果一个对象有很多种行为,如果不用恰当的模 式,这些行为就只有使用多重的条件选择语句。