观察者模式 - 服务台办理业务
1 //业务系统类 2 public class Bank { 3 4 public static void main(String[] args) { 5 //添加柜台 6 Counter counter = new Counter("一号"); 7 SmallScreen smallScreen1 = new SmallScreen("一号显示屏", counter); 8 SmallScreen smallScreen2 = new SmallScreen("二号显示屏", counter); 9 //加入通知显示屏 10 counter.attach(smallScreen1); 11 counter.attach(smallScreen2); 12 //10号办理业务 13 counter.setBizNo("10"); 14 //通知显示屏更新 15 counter.notifyChange(); 16 } 17 } 18 //银行柜台类 19 class Counter{ 20 private Vector<SmallScreen> vectSmallScreen = new Vector<SmallScreen>(); 21 //当前业务号 22 private String bizNo; 23 //柜台名称 24 private String name; 25 //构造函数 26 public Counter(String name) { 27 this.name = name; 28 } 29 //增加一个显示屏 30 public void attach(SmallScreen smallScreen) { 31 vectSmallScreen.add(smallScreen); 32 } 33 //删除一个显示屏 34 public void detach(SmallScreen smallScreen) { 35 vectSmallScreen.remove(smallScreen); 36 } 37 //通知显示屏显示 38 public void notifyChange(){ 39 for(int i=0;i<vectSmallScreen.size();i++) { 40 SmallScreen smallScreen = vectSmallScreen.get(i); 41 smallScreen.display(); 42 } 43 } 44 //获取当前业务号 45 public String getBizNo() { 46 return bizNo; 47 } 48 //设置当前业务号 49 public void setBizNo(String bizNo) { 50 this.bizNo = bizNo; 51 } 52 public String getSubject() { 53 return "请"+this.bizNo+"号到"+this.name+"号柜台办理业务"; 54 } 55 56 } 57 //显示屏类 58 class SmallScreen{ 59 private String name; 60 private Counter counter; 61 //构造函数 62 public SmallScreen(String name, Counter counter) { 63 this.name = name; 64 this.counter = counter; 65 } 66 //更新显示屏 67 public void display(){ 68 try { 69 System.out.println(this.name+":"+counter.getSubject()); 70 }catch(Exception e) { 71 e.printStackTrace(); 72 } 73 74 } 75 76 }
运行结果:
一号显示屏:请10号到一号号柜台办理业务
二号显示屏:请10号到一号号柜台办理业务
适用场景:
当一个抽象模型有两个方面,而其中一个方面必须依赖于另一个方面时。
当对一个对象的改变需要同时改变其他的对象但是不知道具体有多少对象等待改变时。
当一个对象必须通知其他对象但是却不能一其他对象造成紧密耦合时。