转载请注明来自:http://blog.csdn.net/ndzjx/article/details/78027426
设计模式
----------行为型模式
目录
1.迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。
把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。
例子:参观组合模式的遍历
以及工程中的例子
2.策略模式
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(多用组合,少用继承。/ 封装变化)
类图:
so. 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(多用组合,少用继承。/ 封装变化)
3.状态模式
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
菜鸟的例子不好。
糖果售卖机:
类图:
handle中自动处理状态的转换,context的客户对于状态对象了解不多,甚至根本浑然不觉。
和策略模式的类图是一样的,区别:
策略模式:
1. 通常主动指定context所要组合的策略对象是哪一个。(状态类之间产生了依赖)
2. 认为是除继承之外的一种弹性的替代方案,通过组合不同对象来改变行为。
状态模式:
1. 客户对于状态对象了解不多。固然策略模式更有弹性,但是对于某个context来说,通常只有一个最适当的策略对象。
2. 认为是不用再Context中放置许多条件判断的替代方案。可以通过context简单的改变状态来改变context的行为。
两者的意图十分不同。
so. 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
菜鸟的例子不好。
4.模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。
类图:
应用:
(算法,钩子等)
std::find_if (myvector.begin(),myvector.end(), IsOdd); (怎么不是策略)
if (fun())
{
fun2();
}
和策略模式的区别:
1:模板方法模式
使用继承
超类提供基础的方法,达到复用,对于创建框架很有用。
2.策略模式
使用组合,更有弹性,可以在运行时改变行为
定义整个算法
so. 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。
5.命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
1.命令接口
public interfaceCommand { public void execute(); }
2.关台灯命令
public classLightOffCommand implements Command { Light light; public LightOffCommand(Light light) { this.light = light; } public void execute() { light.off(); } }
3.开台灯命令
public classLightOnCommand implements Command { Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.on(); } }
4.台灯
public class Light{ public Light() { } public void on() { System.out.println("Light ison"); } public void off() { System.out.println("Light isoff"); } }
5.遥控器:
public classSimpleRemoteControl { Command slot; public SimpleRemoteControl() {} public void setCommand(Command command) { slot = command; } public void buttonWasPressed() { slot.execute(); } }
6.主函数:
public classRemoteControlTest { public static void main(String[] args) { SimpleRemoteControl remote = newSimpleRemoteControl(); Light light = new Light(); GarageDoor garageDoor = newGarageDoor(); LightOnCommand lightOn = newLightOnCommand(light); GarageDoorOpenCommand garageOpen =new GarageDoorOpenCommand(garageDoor); remote.setCommand(lightOn); remote.buttonWasPressed(); remote.setCommand(garageOpen); remote.buttonWasPressed(); } }
类图:
1. Receiver一定要存在吗?可以和Command合并吗?-》聪明的命令对象。这样调用者和接收者的解耦程度不如 分开的时候。
2. 多层次撤销,用栈
3. 发送者Invoker与Receiver通过命令对象沟通。
so. 将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
6.观察者模式
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
(为了交互对象之间的松耦合设计而努力。松耦合建立有弹性的OO系统,能够应对变化,对象间依赖降到了最低。)
两个角色:主题/观察者。
不举例子了,项目中许多:attach/detach
类图:
7. 责任链模式
8.解释器模式(Interpreter)
9. 中介者模式
类图:
例子:聊天室
10. 备忘录模式
类图:
11.访问者模式
元素通过参数传进访问者接口指针,将自己注册进访问者。
类图:
复习一下:
最后提醒:
不要为了使用而使用。要总是使用满足需要的最简单解决方案,不管它用不用模式。