设计模式----行为型模式

 

转载请注明来自:http://blog.csdn.net/ndzjx/article/details/78027426

设计模式

                                                                                             ----------行为型模式

目录

1.迭代器模式

2.策略模式

3.状态模式

4.模板方法模式

5.命令模式

6.观察者模式

7. 责任链模式

8.解释器模式(Interpreter)

9. 中介者模式

10. 备忘录模式

11.访问者模式

 

 

 

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.访问者模式

 

例子

元素通过参数传进访问者接口指针,将自己注册进访问者。

 

类图:

 

 

 

 

复习一下:

 

最后提醒:

不要为了使用而使用。要总是使用满足需要的最简单解决方案,不管它用不用模式。

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/ndzjx/article/details/78027426