设计模式读书笔记(十一)

"Head First 设计模式第十二章"

Posted by jhljx on January 29, 2018

目录

1. 复合模式

复合模式

复合模式(Compound Pattern)就是一种由模式所构成的模式。

模式通常被一起使用,并被组合在同一个设计解决方案中。复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。

比较巧妙的设计:

public interface QuackObservable {
    public void registerObserver(Observer observer);
    public void notifyObservers();
}
public interface Quackable extends QuackObservable {
    public void quack();
}
public class Observer implements QuackObservable {
    ArrayList observers = new ArrayList();
    QuackObservable duck;
    
    public Observable(QuackObservable duck){
        this.duck = duck;
    }
    
    public void registerObserver(Observer observer){
        observers.add(observer);
    }
    
    public void notifyObservers(){
        Iterator iterator = observers.iterator();
        while(iterator.hasNext()){
            Observer observer = (Observer)iterator.next();
            observer.update(duck);
        }
    }
}
public class MallardDuck implements Quackable{
    Observer observable;
    
    public MallardDuck(){
        observable = new Observer(this);
    }
    
    public void quack(){
        System.out.print("Quack");
        notifyObservers();
    }
    
    public void registerObserver(Observer observer){
        observer.registerObserver(observer);
    }
    
    public void notifyObservers(){
        observable.notifyObservers();
    }
}

MVC模式是由多个设计模式结合起来的模式。

  • 视图:用来呈现模型。视图通常直接从模型中取得它需要显示的状态与数据。
  • 控制器:取得用户的输入并解读其对模型的意思。
  • 模型:模型持有所有的数据、状态和程序逻辑。模型没有注意到视图和控制器,虽然它提供了操纵和检索状态的接口,并发送状态改变通知给观察者。
  1. 你是用户——你和视图交互。
    视图是模型的窗口。当你对视图做一些事时(比如说,按下“播放”按钮),视图就告诉控制器你做了什么。控制器会负责处理。
  2. 控制器要求模型改变状态。
    控制器解读你的动作。如果你按下某个按钮,控制器会理解这个动作的意义,并告知模型如何做出对应的动作。
  3. 控制器也可能要求视图做出改变。
    当控制器从视图接收到某一动作,结果可能是它也需要告诉视图改变其结果。比方说,控制器可以将界面上的某些按钮或菜单项变成有效或无效。
  4. 当模型状态改变时,模型会通知视图。
    不管是你做了某些动作(比如说按下按钮)还是内部有了某些改变(比方说播放清单的下一首歌开始),只要当模型内的东西改变时,模型都会通知视图它的状态改变了。
  5. 视图向模型询问状态。
    视图直接从模型取得它显示的状态。比方说,当模型通知视图新歌开始播放,视图向模型询问歌名并显示出来。当控制器请求视图改变时,视图也可能向模型询问某些状态。

在某些设计中,控制器可以变成模型的观察者,控制器会向模型注册,模型一有改变通知控制器。当模型直接影响到用户界面时,就会这么做。

在MVC模式中,视图和控制器实现了经典的策略模式:视图是一个对象,可以被调整使用不同的策略,而控制器提供了策略。视图只关心系统中可视的部分,对于任何界面行为,都委托给控制器处理。使用策略模式也可以让视图和模型之间的关系解耦,因为控制器负责和模型交互来传递用户的请求。对于工作是怎么完成的,视图毫不知情。

视图内部的显示包括了窗口、面板、按钮、文本标签等。每个显示组件如果不是组合节点(例如窗口),就是叶节点(例如按钮)。当控制器告诉视图更新时,只需告诉视图最顶层的组件即可,组合模式会处理其余的事。

模型实现了观察者模式,当状态改变时,相关对象将持续更新。使用观察者模式,可以让模型完全独立于视图和控制器。。同一个模型可以使用不同的视图,甚至可以同时使用多个视图。

  • 装饰者:包装一个对象,以提供新的行为。
  • 状态模式:封装了基于状态的行为,并使用委托在行为之间切换。
  • 迭代器模式:在对象集合之中游走,而不暴露集合的实现。
  • 外观模式:简化一群类的接口。
  • 策略模式:封装可以互换的行为,并使用委托来决定要使用哪一个。
  • 代理模式:包装对象,以控制对此对象的访问。
  • 工厂方法:由子类决定要创建的具体类是哪一个。
  • 适配器模式:封装对象,并提供不同的接口。
  • 观察者模式:让对象能够在状态改变时被通知。
  • 模板方法:由子类决定如何实现一个算法中的步骤。
  • 组合模式:客户用一致的方法处理对象集合和单个对象。
  • 单件模式:确保有且只有一个对象被创建。
  • 抽象工厂:允许客户创建对象的家族,而无需指定他们的具体类。
  • 命令模式:封装请求成对象。

模式分类:

  • 创建型:Singleton, Builder, Prototype, Abstract Factory, Factory Method
  • 结构型:Decorator, Composite, Proxy, Facade, Flyweight, Bridge, Adapter
  • 行为型:Template Method, Vistor, Mediator, Iterator, Command, Memento, Interpreter, Observer, Chain of Responsibility, State, Strategy