码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2018-05-19 16:56:13      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:size   依赖关系   移除   关系   list   java   引用   print   接收   

 

  观察者模式也是 发布-订阅模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化的时候,会通知所有观察者对象,使他们能够自动更新自己。

  观察者模式主要包括以下几个角色:

  1、Subject(抽象主题角色)

  2、ConcreteSubject(具体的主题角色):它会存有所有观察者的引用,以便于及时通知他们。

  3、Observer(抽象观察者角色)

  4、ConcreteObserver(具体的观察者)

 

  下面就直接上代码:

  1、先定义抽象主题角色:包括注册观察者和移除观察者,以及通知观察者

package com.hd.observer;

public interface Observable {

    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyAllObservers();
}

 

  2、具体观察者

package com.hd.observer;

import java.util.ArrayList;
import java.util.List;

public class WechatServer implements Observable {

    private List<Observer> observers = new ArrayList<Observer>();
    private String msg;
    
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    @Override
    public void notifyAllObservers() {
        
        for(Observer observer: observers){
            observer.update(msg);
        }
    }
    
    public void setInformation(String msg){
        System.out.println("wechat push message: "+ msg);
        this.msg = msg;
        notifyAllObservers();  //状态改变的时候,同时触发通知观察者
    }
}

 

  3、抽象观察者。 它会有一个update方法,用来接收主题角色的通知

package com.hd.observer;

public interface Observer {
    void update(String msg);    //接收主题角色的通知
}

 

  4、具体的观察者

package com.hd.observer;

public class ConcreteObserver implements Observer {

    private String name;
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String msg) {
        System.out.println(name + " receive message: " + msg);
        
    }
}

 

  5、下面测试一下:

package com.hd.observer;

public class TestObserver {

    public static void main(String[] args) {
        
        ConcreteObserver o1 = new ConcreteObserver("jack");
        ConcreteObserver o2 = new ConcreteObserver("jet");
        ConcreteObserver o3 = new ConcreteObserver("tony");
        
        WechatServer server = new WechatServer();
        server.registerObserver(o1);
        server.registerObserver(o2);
        server.registerObserver(o3);
        server.setInformation("java is the world best language");
System.
out.println("------------------------------");
server.removeObserver(o1); server.setInformation(
"python is the world best language"); } }

  

  看下测试结果:

wechat push message: java is the world best language
jack receive message: java is the world best language
jet receive message: java is the world best language
tony receive message: java is the world best language
------------------------------
wechat push message: python is the world best language
jet receive message: python is the world best language
tony receive message: python is the world best language

 

  未完待续。。。

观察者模式

标签:size   依赖关系   移除   关系   list   java   引用   print   接收   

原文地址:https://www.cnblogs.com/xiexin2015/p/9060573.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!