ivaneye.com

语言与模式-17命令模式

意图

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作

适用性

Java实现

接收者角色类

public class Receiver {
    /**
     * 真正执行命令相应的操作
     */
    public void action(){
        System.out.println("执行操作");
    }
}

抽象命令角色类

public interface Command {
    /**
     * 执行方法
     */
    void execute();
}

语言与模式-16责任链模式

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用性

Java实现

public abstract class Handler {
    protected Handler successor;
    public abstract void handlerRequest(String condition);
    public Handler getSuccessor() {
        return successor;
    }
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

语言与模式-15观察者模式

意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

适用性

Java实现

public abstract class Subject {
    /**
     * 用来保存注册的观察者对象
     */
    private    List<Observer> list = new ArrayList<Observer>();
    /**
     * 注册观察者对象
     * @param observer    观察者对象
     */
    public void attach(Observer observer){
        list.add(observer);
        System.out.println("Attached an observer");
    }
    /**
     * 删除观察者对象
     * @param observer    观察者对象
     */
    public void detach(Observer observer){
        list.remove(observer);
    }
    /**
     * 通知所有注册的观察者对象
     */
    public void nodifyObservers(String newState){
        for(Observer observer : list){
            observer.update(newState);
        }
    }
}

语言与模式-14备忘录模式

意图

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

适用性

Java实现

public class Memento {
    private String state;
    public Memento(String state){
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}

语言与模式-13模板模式

意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

适用性

Java实现

web开发中使用的布局就是模板模式的典型应用!

public abstract class Layout{
     public void show(){
          System.out.println("Header");
          body();
          System.out.println("Footer");
     }
     public abstract void body();
}
public class Index extends Layout{
     public void body(){
       System.out.println("Index");
     }
}
public class Detail extends Layout{
     public void body(){
       System.out.println("Detail");
     }
}

语言与模式-12享元模式

意图

运用共享技术有效地支持大量细粒度的对象。

适用性

Java实现

抽象享元角色类

public interface Flyweight {
    //一个示意性方法,参数state是外蕴状态
    public void operation(String state);
}
public class ConcreteFlyweight implements Flyweight {
    private Character intrinsicState = null;
    /**
     * 构造函数,内蕴状态作为参数传入
     * @param state
     */
    public ConcreteFlyweight(Character state){
        this.intrinsicState = state;
    }
    /**
     * 外蕴状态作为参数传入方法中,改变方法的行为,
     * 但是并不改变对象的内蕴状态。
     */
    @Override
    public void operation(String state) {
        // TODO Auto-generated method stub
        System.out.println("Intrinsic State = " + this.intrinsicState);
        System.out.println("Extrinsic State = " + state);
    }
}

语言与模式-11桥接模式

意图

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

适用性

Java实现

//电视机的接口
public interface ITV {
    public void on();
    public void off();
    public void switchChannel(int channel);
}
//三星的ITV
public class SamsungTV implements ITV {
    @Override
    public void on() {
        System.out.println("Samsung is turned on.");
    }
    @Override
    public void off() {
        System.out.println("Samsung is turned off.");
    }
    @Override
    public void switchChannel(int channel) {
        System.out.println("Samsung: channel - " + channel);
    }
}