zoukankan      html  css  js  c++  java
  • Java观察者模式(Observer)

    一、定义

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。主要应用在java的AWT事件机制。

    二、角色

    • 抽象主题角色(Subject):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
    • 具体主题角色(RealSubject):在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
    • 抽象观察者角色(Observer):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
    • 具体观察者角色(RealObserver):该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现。

    三、代码演示

    抽象观察者角色(Observer)

    /**
     * 抽象观察者角色
     * @author zhangkang
     *
     */
    public interface MyObserver {
    	void update(String message,String subjectName);
    }

     具体观察者角色1(RealObserver1)

    /**
     * 具体观察者1
     * @author zhangkang
     *
     */
    public class RealObserver1 implements MyObserver{
    	
    	private String name; 
    	
    	public RealObserver1(String name) {
    		this.name = name;
    	}
    	
    	@Override
    	public void update(String message, String subjectName) {
    		System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
    	}
    }

    具体观察者角色2(RealObserver2)

    /**
     * 具体观察者2
     * @author zhangkang
     *
     */
    public class RealObserver2 implements MyObserver{
    	
    	private String name;
    	
    	public RealObserver2(String name) {
    		this.name = name;
    	}
    	
    	@Override
    	public void update(String message, String subjectName) {
    		System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
    	}
    }
    

    抽象主题角色(Subject)

    /**
     * 抽象主题角色
     * @author zhangkang
     *
     */
    public interface MySubject {
    	void addObserver(MyObserver o); //添加观察者
    	void deleteObserver(MyObserver o); //删除观察者
    	void notifyObservers(String message); //通知所有的观察者
    }

    具体主题角色(RealSubject)

    import java.util.ArrayList;
    import java.util.List;
    /**
     * 具体主题
     * @author zhangkang
     *
     */
    public class RealSubject implements MySubject{
    	
    	private String subjectName = "官方"; //主题名称
    	
    	private List<MyObserver> list; //集合用来保存每个观察者
    	
    	public RealSubject() {
    		list = new ArrayList<MyObserver>();
    	}
    	
    	@Override
    	public void addObserver(MyObserver o) {
    		list.add(o);
    	}
    
    	@Override
    	public void deleteObserver(MyObserver o) {
    		list.remove(o);
    	}
    
    	@Override
    	public void notifyObservers(String message) {
    		for (MyObserver myObserver : list) {
    			myObserver.update(message, subjectName);
    		}
    	}
    }

    客户端测试

    /**
     * 客户端测试
     * @author zhangkang
     *
     */
    public class Test {
    	public static void main(String[] args) {
    		//定义两个观察者
    		MyObserver o1 = new RealObserver1("段友1");
    		MyObserver o2 = new RealObserver2("段友2");
    		
    		//定义一个主题
    		MySubject subject = new RealSubject();
    		//添加观察者
    		subject.addObserver(o1);
    		subject.addObserver(o2);
    		//发布消息通知观察者
    		subject.notifyObservers("内涵段子TV已下架!");
    	}
    }
    
    输出:
    段友1:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
    段友2:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
  • 相关阅读:
    07-selenium、PhantomJS(无头浏览器)
    06爬虫-异步协程
    Numpy数值类型与数值运算-03
    05爬虫-requests模块基础(2)
    初识Matplotlib-01
    03爬虫-requests模块基础(1)
    Django安装与简单事例-02
    JavaWeb学习总结(二):Http协议
    Tomcat学习总结(一):目录简介
    Web服务器学习总结(一):web服务器简介
  • 原文地址:https://www.cnblogs.com/neuzk/p/9476413.html
Copyright © 2011-2022 走看看