观察者模式看了比较久,书中感觉说得有点乱,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属性。
运行结果: