《大话设计模式》java实现之观察者模式

观察者模式看了比较久,书中感觉说得有点乱,UML图与网上差别也比较大,先说UML,书中的UML为
《大话设计模式》java实现之观察者模式_第1张图片
从UML就可以看出,具体的Subject类(Secretary、Boss)什么都没有,连构造方法都不需要,这个也可以从代码中可以看到,完全可以放在父类Subject中实现,因此没必要再写多这几个类,参考菜鸟教程http://www.runoob.com/design-pattern/observer-pattern.html后改为如下UML
《大话设计模式》java实现之观察者模式_第2张图片
另外,网上也有博主的UML把Subject和Observer定义为接口interface,一开始我也是这样做的,但是由于在本例中,Subject和Observer都含有变量,java的接口一般不定义变量,也比较少写方法实现,因此如果写成接口的话,子类还是会有很多重复的代码,因此定义为abstract class更合适。
代码结构
《大话设计模式》java实现之观察者模式_第3张图片
这里把boss和Secretary放在一起,因为这两个类什么都没有,按照菜鸟教程的UML图是可以直接不使用的。

public class Boss extends Subject {

}
public class Secretary extends Subject {

}
public class Client {
    public static void main(String[] args) {
        Subject huhansan = new Boss();
        StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
        NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);

        huhansan.attach(tongshi1);
        huhansan.attach(tongshi2);

        huhansan.detach(tongshi1);

        huhansan.setAction("我胡汉三回来了");
        huhansan.notifyObservers();
    }
}
public class NBAObserver extends Observer {

    public NBAObserver(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void update() {
        System.out.println(getSubject().getAction() + ", " + getName() + "关闭NBA直播,继续工作");
    }

}
public abstract class Observer {
    private String name;   //书中是proctected
    private Subject subject;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Subject getSubject() {
        return subject;
    }

    public void setSubject(Subject subject) {
        this.subject = subject;
    }

    public Observer(String name, Subject subject) {
        super();
        this.name = name;
        this.subject = subject;
    }

    public abstract void update();
}
public class StockObserver extends Observer {

    public StockObserver(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void update() {
        System.out.println(getSubject().getAction() + ", " +  getName() + ",关闭股票行情,继续工作");
    }
public abstract class Subject {
    private List observers = new ArrayList<>();
    private String action;

    public List getObservers() {
        return observers;
    }

    public void setObservers(List observers) {
        this.observers = observers;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public Subject() {
        super();
    }

    public Subject(List observers, String action) {
        super();
        this.observers = observers;
        this.action = action;
    }

    //增加
    public void attach(Observer observer) {
        observers.add(observer);
    }

    //减少
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    //通知
    public void notifyObservers() {    //由于notify在java中是Object中的final方法,所以这里把notify方法改名为notifyObserver方法
        for(Observer o : observers) {
            o.update();
        }
    }
}

书中还有一个subjectState,实际就是subject里的action,为了方便,这里直接使用action属性。
运行结果:
《大话设计模式》java实现之观察者模式_第4张图片

你可能感兴趣的:(《大话设计模式》java实现之观察者模式)