1观察者模式
观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
观察者模式定义如下: 观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
2实现类代码
https://github.com/qingqian7/distributedSystem/blob/master/src/ClientSocket.java
被观察者的一方
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.io.PrintWriter; 5 import java.net.Socket; 6 import java.net.UnknownHostException; 7 import java.util.Observable; 8 9 public class ClientSocket extends Observable implements Runnable { 10 private volatile boolean isStopped = false; 11 Socket socket = null; 12 BufferedReader br = null; 13 PrintWriter pw = null; 14 15 public ClientSocket() throws Exception { 16 socket = new Socket("127.0.0.1",6000); 17 } 18 public void doBusiness() { 19 if(true) { 20 super.setChanged(); 21 } 22 notifyObservers(); 23 } 24 25 @Override 26 public void run() { 27 // TODO Auto-generated method stub 28 try { 29 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 30 pw = new PrintWriter(socket.getOutputStream()); 31 System.out.println("debug....."); 32 String line ; 33 while(!isStopped) { 34 while((line = br.readLine()) != null) { 35 System.out.println(line); 36 switch(line) { 37 case "1": 38 String address = socket.getInetAddress().toString(); 39 pw.write(address); 40 pw.flush(); 41 break; 42 case "2": 43 isStopped = true; 44 doBusiness(); 45 break; 46 } 47 } 48 } 49 50 } catch (IOException e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 54 } 55 public static void main(String[] args) throws Exception { 56 ClientSocket cs = new ClientSocket(); 57 ClientListener listener = new ClientListener(); 58 cs.addObserver(listener); 59 new Thread(cs).start(); 60 } 61 62 63 }
https://github.com/qingqian7/distributedSystem/blob/master/src/ClientListener.java
观察者的一方
import java.util.Observable; import java.util.Observer; public class ClientListener implements Observer{ @Override public void update(Observable arg0, Object arg1) { // TODO Auto-generated method stub System.out.println("刚才线程挂掉,现在重启"); ClientSocket cs = null; try { cs = new ClientSocket(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cs.addObserver(this); new Thread(cs).start(); System.out.println("已经重启"); } }
被观察者的乙方中 线程会随接收到的消息而被挂断,而观察者可以监听这个被观察者,当发现被观察者做出了有了改变时,可以做出自定义的动作。
观察者模式的优点如下:
(1) 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。
(2) 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
(3) 观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。
(4) 观察者模式满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。
浙公网安备 33010602011771号