设计模式篇—— 观察者模式
public abstract class AllayControlCenter { public String allayName; public List<Observer> ObsList = new ArrayList<>(); public String getAllayName() { return allayName; } public void setAllayName(String allayName) { this.allayName = allayName; } public void join(Observer obs) { System.out.println(obs.getName() + "加入" + this.getAllayName() +"战队"); ObsList.add(obs); } public void quit(Observer obs) { System.out.println(obs.getName() + "退出" + this.getAllayName() +"战队"); ObsList.remove(obs); } public abstract void notifyObserver(String name) ; }
|
public interface Observer { public String getName(); public void setName(String name); public void beAttacked(AllayControlCenter acc); //收到攻击给指挥中心发送求救信息 public void help();//接受指挥中心的求救信息 }
|
public class Player implements Observer{ private String name; public Player(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public void beAttacked(AllayControlCenter acc) { System.out.println(this.name + "被攻击,请求支援"); acc.notifyObserver(name); } @Override public void help() { System.out.println("坚持住," + this.name +"马上到"); } } |
public class ConcreteAllayControlCenter extends AllayControlCenter { public ConcreteAllayControlCenter(String allyName) { System.out.println(allyName + "战队组建成功"); this.allayName = allyName; System.out.println("--------------------------"); } @Override public void notifyObserver(String name) { System.out.println(this.getAllayName() + "战队紧急通知,盟友" + name + "收到攻击,请求支援"); //遍历队友集合,推送救援消息,去除给自己推送信息 for(Observer obs : ObsList) { if(!obs.getName().equals(name)) { obs.help(); } } } }
|
public class Main { public static void main(String[] args) { AllayControlCenter acc = new ConcreteAllayControlCenter("西游大哥"); Observer ts = new Player("唐僧"); acc.join(ts); Observer wk = new Player("悟空"); acc.join(wk); Observer bj = new Player("八戒"); acc.join(bj); Observer wj = new Player("悟净"); acc.join(wj); Observer xbl = new Player("小白龙"); acc.join(xbl); Observer cyj = new Player("程咬金"); acc.join(cyj); acc.quit(cyj); wj.beAttacked(acc); } } |
应用:
- JDK中的Observable类 目标类,用Vector存储观察者对象
Observer接口观察者 update();
用户可以直接使用,自己来定义观察者和目标的实现类
- MVC模式: M为目标,V是观察者, C作为中介, V观察M,M改变V改变
- java事件监听机制
优势:表示层和数据逻辑层分离; 通过抽象耦合,无需关注具体观察者;符合开闭原则;支持一对多广播式通信。
缺点:观察者过多时通知时间花费大;观察者和目标之间存在循环依赖时可能导致系统崩溃;观察者只知目标变化不知发生怎样变化
本文知识源自刘伟老师编著清华大学出版社出版《java设计模式》一书
适用:
- 一个模型存在两个方面,并且一方面依赖另一方面,还要讲两方面各种封装
- 一个改变,另外多个会改变 但是不知的有多少改变,也不知道改变了什么
- 可以触发链式触发机制 A改变影响B B改变影响C…