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

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

    public List<Observer> getObservers() {
        return observers;
    }

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

    public String getAction() {
        return action;
    }

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

    public Subject() {
        super();
    }

    public Subject(List<Observer> 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属性。
运行结果:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值