小菜写的第三份代码
1、抽象通知者接口
在小菜给出的第二份代码中,既然有抽象的观察者,就应该有对应的抽象通知者。
public interface Subject {
void Attach(Observer observer); // 增加
void Detach(Observer observer); // 减少
void Notify(); // 通知同事
void SubjectState(String value); // 修改前台状况消息
String SubjectState(); // 发出前台状态消息
}
2、具体的通知类
代码内容与第二份代码中前台秘书类内容类似
public class Boss implements Subject {
private List<Observer> observers =
new ArrayList<Observer>();
private String action;
@Override
public void Attach(Observer observer) {
observers.add(observer);
}
@Override
public void Detach(Observer observer) {
observers.remove(observer);
}
@Override
public void Notify() {
for(Observer o : observers) {
o.Update();
}
}
@Override
public void SubjectState(String value) {
this.action = value;
}
@Override
public String SubjectState() {
return this.action;
}
}
3、抽象观察者
属性:
- 1、String的name,不变
- 2、Subject的sub,这个是抽象通知者类在这份代码修改的部分。
原来是“前台”,现在改为抽象通知者。
只有将其设置为抽象类型才能实现泛指,而不是具体通知者那样的单一情况。方法:
- 1、不变,依旧是抽象的Update(),待到子类里重写。
public abstract class Observer {
protected String name;
protected Subject sub;
public Observer(String name, Subject sub) {
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
4、具体观察者
这个修改的内容一样,将前台改为抽象通知者
public class StockObserver extends Observer {
public StockObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void Update() {
System.out.println(sub.SubjectState() + name +
" 关闭股票行情,继续工作!");
}
}
public class NBAObserver extends Observer {
public NBAObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void Update() {
System.out.println(sub.SubjectState() + name +
" 关闭NBA直播,继续工作!");
}
}
5、客户端代码
public class Observer3Demo {
public static void main(String[] args) {
Boss huhansan = new Boss();
StockObserver tongshi1 = new StockObserver("大鸟", huhansan);
NBAObserver tongshi2 = new NBAObserver("小菜", huhansan);
huhansan.Attach(tongshi1);
huhansan.Attach(tongshi2);
huhansan.Detach(tongshi1);
huhansan.SubjectState("我胡汉三又回来了!");
huhansan.Notify();
}
}
6、输出结果
我胡汉三又回来了!小菜 关闭NBA直播,继续工作!