四、行为型模式(11)
java-design-patterns.com/patterns/
| 行为型模式( Behavioral Patterns) |
|---|
| 行为型模式关注对象之间的交互和职责分配,描述类或对象如何相互通信以及如何分配职责。 |
| 方法设计的角度。 |
Strategy
| 策略模式(Strategy Pattern) |
|---|
| 定义一个算法族,封装每个算法,并使它们可互换。Strategy 允许算法独立于使用它的客户端而变化。也称为政策模式(Policy)。策略模式是一种对象行为型模式。 |
| 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口) ;第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。 |
| 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略 (或者行为) 即可,避免了使用多重转移语句 (if..else if..else) |
1.类图
| 类图 |
|---|
1.策略接口(Strategy Interface): 定义了所有支持的算法的公共接口。这样,任何实现了这个接口的类都可以作为一个策略被使用。按照策略模式的经典定义,Strategy更常见的是作为一个接口或一个抽象类。 |
| 2.具体策略类(Concrete Strategy Classes): 实现了策略接口的具体算法类。每个具体策略类封装了一个具体的算法或行为。在运行时,客户端可以选择不同的具体策略类来执行不同的算法。 |
| 3.上下文类(Context): 使用策略对象的类。它通常持有一个策略对象的引用,并且可以根据需要在不同的策略之间切换。上下文类定义了一个接口来让策略访问它的数据(如果需要的话)。说明::从上图可以看到,客户context 有成员变量strategy或者其他的策略接口至于需要使用到哪个策略,我们可以在构造器中指定。 |
| 4.App类 |
2.应用
Java的Java .util. comparator接口是Strategy模式的一个常见示例。
某旅游公司欲开发一套软件系统,要求能根据季节,节假日等推出不同的旅行定价包,如淡季打折、一口价等。实现该要求适合采用策略模式。
State
| 状态模式(State Pattern) |
|---|
| 允许对象在其内部状态改变时改变其行为。对象似乎改变了它的类。 |
| 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。 |
| 状态和行为是一一对应的,状态之间可以相互转换。 |
1.类图
| 类图 |
|---|
| 1.State(状态接口):定义一个所有具体状态类的公共接口,声明处理状态相关的方法,这些方法分别对应了上下文对象在不同状态下需要展现的不同行为。 |
| 2.ConcreteState(具体状态类):实现State接口,每一个具体状态类代表上下文的一个具体状态,提供该状态下上下文对象的行为实现。 |
| 3.Context(上下文类):维护一个State对象的引用,这个引用定义了当前状态。上下文对象可以根据内部逻辑改变这个引用,从而改变状态,同时提供一个接口给外部调用,而这个接口会委托给当前的State对象处理,从而实现状态的切换和对应行为的执行。 |