观察者模式分析

Posted on 2018-10-25 17:48  也拟疏狂  阅读(202)  评论(0)    收藏  举报

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) 观察者模式满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。