几个同事上班期间看股市行情,让前台MM帮忙看着老板何时过来查岗,老板进门的时候MM就拨电话给其中一个同事,因而全部同事都知道了,再继续工做。。。编程
/** * 前台秘书MM * Created by callmeDevil on 2019/7/27. */ public class Secretary { // 同事列表 private List<StockObserver> observers = new ArrayList<>(); private String action; // 增长 public void attach(StockObserver observer){ // 有几个同事请前台帮忙,因而就给集合增长几个对象 observers.add(observer); } // 通知 public void call(){ // 待老板来了,就给全部登记的同事们发通知 for (StockObserver observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
/** * 看股票同事 * Created by callmeDevil on 2019/7/27. */ public class StockObserver { private String name; private Secretary sub; public StockObserver(String name, Secretary sub){ this.name = name; this.sub = sub; } public void update(){ System.out.println(String.format("%s %s 关闭股票行情,继续工做!", sub.getAction(), name)); } }
public class Test { public static void main(String[] args) { // 前台妹子 Secretary mm = new Secretary(); // 看股票的同事 StockObserver observer1 = new StockObserver("哪路托", mm); StockObserver observer2 = new StockObserver("啥是gay", mm); // 前台妹子记下两位同事 mm.attach(observer1); mm.attach(observer2); // 发现老板 mm.setAction("老板回来了!"); // 通知两个同事 mm.call(); } }
老板回来了! 哪路托 关闭股票行情,继续工做! 老板回来了! 啥是gay 关闭股票行情,继续工做!
/** * 抽象观察者 * Created by callmeDevil on 2019/7/27. */ public abstract class Observer { protected String name; protected Secretary sub; public Observer(String name, Secretary sub) { this.name = name; this.sub = sub; } public abstract void update(); }
/** * 前台秘书MM * Created by callmeDevil on 2019/7/27. */ public class Secretary { // 同事列表 private List<Observer> observers = new ArrayList<>(); private String action; // 增长 public void attach(Observer observer) { //针对抽象编程,减小了与具体类的耦合 observers.add(observer); } // 减小 public void detach(Observer observer) { //针对抽象编程,减小了与具体类的耦合 observers.remove(observer); } // 通知 public void call() { for (Observer observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
/** * 看股票的同事 * Created by callmeDevil on 2019/7/27. */ public class StockObserver extends Observer { public StockObserver(String name, Secretary sub) { super(name, sub); } @Override public void update(){ System.out.println(String.format("%s %s 关闭股票行情,继续工做!", sub.getAction(), name)); } }
/** * 看 NBA 的同事 * Created by callmeDevil on 2019/7/27. */ public class NBAObserver extends Observer { public NBAObserver(String name, Secretary sub) { super(name, sub); } @Override public void update() { System.out.println(String.format("%s %s 关闭NBA 直播,继续工做!", sub.getAction(), name)); } }
测试代码同上ide
其实“前台MM”也应该抽象出来,若是老板回来时,MM来不及电话了,因而通知你们的任务变成谁来作?是的,这时候是老板本人变成了通知者。工具
又叫作发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知全部观察者对象,使它们可以自动更新本身。测试
/** * 通知者接口 * Created by callmeDevil on 2019/7/27. */ public interface Subject { void attach(Observer observer); void detach(Observer observer); void call(); String getAction(); void setAction(String action); }
/** * 老板 * Created by callmeDevil on 2019/7/27. */ public class Boss implements Subject { // 同事列表 private List<Observer> observers = new ArrayList<>(); private String action; @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void call() { for (Observer observer : observers) { observer.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
/** * 抽象观察者 * Created by callmeDevil on 2019/7/27. */ public abstract class Observer { protected String name; protected Subject sub; public Observer(String name, Subject sub) { // 原来是“前台MM”,现改为“抽象通知者” this.name = name; this.sub = sub; } public abstract void update(); }
/** * 看股票的同事 * Created by callmeDevil on 2019/7/27. */ public class StockObserver extends Observer { public StockObserver(String name, Subject sub) { // 原来是“前台MM”,现改为“抽象通知者” super(name, sub); } @Override public void update(){ System.out.println(String.format("%s %s 关闭股票行情,继续工做!", sub.getAction(), name)); } }
public class Test { public static void main(String[] args) { // 老板 Boss boss = new Boss(); // 看股票的同事 StockObserver observer1 = new StockObserver("哪路托", boss); // 看NBA的同事 NBAObserver observer2 = new NBAObserver("啥事gay", boss); boss.attach(observer1); boss.attach(observer2); boss.detach(observer1); // 主角光环!斑怎么样都打不过哪路托!因此减去 // 斑复活了! boss.setAction("我宇智波斑复活了!"); // 发出通知 boss.call(); } }
我宇智波斑复活了! 啥事gay 关闭NBA 直播,继续工做!