第11章 GoF设计模式(三)

目录
11.6行为型设计模式
概述
职责链模式
命令模式
迭代器模式
备忘录模式
观察者模式
策略模式
模板方法
11.7  行为型模式比较
命令模式与策略模式
观察者模式与职责链模式
11.6.1 行为型模式概述

行为型模式涉及到算法和对象间职责的分配。
行为型类模式采用继承机制在类间分派行为。
行为型对象模式使用对象组合而不是继承。
一些对象模式描述一组对等对象怎样协作完成其中任一个对象都无法单独完成的任务。
其他行为对象模式常将行为封装在一个对象中并将请求指派给它。

11.6.2 职责链模式(Chain of Responsibility)

例子——“三从四德”
未嫁从父
既嫁从夫
夫死从子

public  interface  IWomen{
    public  int  getType();
    public  String  getRequest();
}
public  class  Women implements  IWomen{
    private int  type=0;
    private String  request=“”;
    public  Women(int t,String  r){
         type=t; request =r;
    }
    public int getType(){return type;}
    public String getRequest(){return request;}
public  interface   IHandler{
    public  void  handleMessage(IWomen  women){
}
public  class  Father  implements  IHandler{
    public  void handleRequest(IWomen  w){
        System.out.println(“daughter:” + w.getRequest());
        System.out.println(“father: OK”);
    }
}
……
   
public   class   Client{
    public static void main(String[] args){
        Random  rand=new Random();
        ArrayList<IWomen> al=new ArrayList();
        for (int i=0;i<5;i++){            al.add(new Women(rand.nextInt(4),”go shopping”));
        }
        IHandler  father=new Father();
        IHandler  husband=new Husband();
        IHandler  son=new Son();
       for(IWomen  w:al){           swich w.getType()
               case 1:
                   System.out.println(“\n-----girl request father-----”);
                   father.handleRequest(w);
               case 2:
                   System.out.println(“\n-----wife request husband-----”);
                   husband.handleRequest(w);
        ……
结构

应用效果
优点
将请求和处理分开,解耦提高了灵活性
缺点
性能问题
调试不很方便

11.6.3 命令模式(Command)

例子——项目管理

结构

参与者
Command
声明执行操作的接口
ConcreteCommand
将接收者绑定于一个动作
Client
创建一个具体命令对象并设定接收者
Invoker
要求该命令执行这个请求
Receiver
知道如何实施与执行一个请求相关的操作
协作

效果
调用者和接收者解耦
Command子类容易扩充

11.6.4 迭代器模式(Iterator)

意图
        提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示
别名
        游标 Cursor
结构

参与者
Iterator
定义访问和遍历元素的接口
ConcreteIterator
对该聚合遍历时跟踪当前位置
Aggregate
定义聚合
ConcreteAggregate
具体聚合
效果
支持以不同方式遍历一个聚合
简化了聚合的接口
在同一聚合上可以有多个遍历

11.6.5 备忘录模式(Memento)

意图
  在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存。以后需要就可将该对象恢复到原先保存的状态。
别名
          Token
结构

参与者
Memento
备忘录存储原发器的内部状态
防止原发器以外的其他对象访问备忘录
Originaator
原发器创建备忘录,记录当前内部状态
使用备忘录恢复内部状态
Caretaker
负责保存好备忘录
不能对备忘录的内容进行操作或检查
效果
保持封装边界
简化了原发器
使用和维护可能代价很高

11.6.6 观察者模式(Observer)

意图
       定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
别名
  依赖(Dependents)、发布-订阅(Publish-Subscribe)
动机
        克服将系统分为一系列相互协作的类的副作用

结构

参与者
Subject:目标。要知道它的观察者;提供关联和分离观察者的接口。
Observer:观察者。定义更新接口(目标改变了要通知的对象)
ConcreteSubject:具体目标对象。存储状态;发送通知
ConcreteObserver:具体观察者。保持一个对具体目标的引用。实现观察者更新接口。
效果
抽象了目标和观察者之间的耦合
支持广播通信
注意意外更新

11.6.7 策略模式(Strategy)

意图
  定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
别名
政策(Policy)
动机    
结构

参与者
Strategy:策略类。声明一个支持所有算法的通用接口
ConcreteStrategy:具体策略。实现一个具体算法。
Context:应用环境。可以用具体策略配置;保持到策略对象的引用;可以定义一个接口让策略对象访问其数据。

11.6.8 模板方法(Template Method)

意图
       定义一个操作的算法的骨架,而将一些步骤延迟到子类中。
动机
        如Application/Document类的应用框架
结构

参与者
AbastractClass:抽象类.定义一个抽象的基本操作;实现一个模板方法定义算法的框架。
ConcreteClass:实现基本操作。

11.7 行为型模式比较

Command vs Strategy
相同点
  命令模式退化时,就和策略模式类图完全一样。
(无接收者——接收者非常简单或者接收者是一个java的基础操作,无需专门编写一个接收者)
区别
关注点不同
策略模式关注的是算法替换问题,命令模式关注的是解耦问题
角色功能不同
策略模式的具体算法负责完整算法逻辑,是原子业务单元。
命令模式中接收者对命令负责,与请求者无关。
使用场景不同
 Observer vs CoR
    观察者模式中一个具体的角色可以是观察者也可以是被观察者,这样形成了一个观察者链(触发链)
    链中的消息对象不同
职责链基本上不改变消息对象的结构,触发链允许改变。
上下节点的关系不同
职责链中,上下节点没关系。触发链上下级关系密切。
消息的分销渠道不同
职责链中消息单向运动,触发链传递不固定。
小结
行为型设计模式涉及到算法和对象间职责的分配。
职责链模式提供更松散的耦合。
命令模式将请求封装在对象中。
迭代器模式抽象了访问和遍历一个集合中的对象的方式。
备忘录模式在不破坏封装的前提下,把对象的内部状态保存在对象之外,需要时可以恢复。
观察者模式定义并保持对象间的依赖关系。MVC
策略模式将算法封装在对象中。
模板方法是一个算法的抽象定义,子类具体实现。































































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值