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