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已下架!】
  • 相关阅读:
    Oracle 11g SQL Fundamentals Training Introduction02
    Chapter 05Reporting Aggregated data Using the Group Functions 01
    Chapter 01Restriicting Data Using The SQL SELECT Statemnt01
    Oracle 11g SQL Fundamentals Training Introduction01
    Chapter 04Using Conversion Functions and Conditional ExpressionsConditional Expressions
    Unix时代的开创者Ken Thompson (zz.is2120.bg57iv3)
    我心目中计算机软件科学最小必读书目 (zz.is2120)
    北京将评估分时分区单双号限行 推进错时上下班 (zz)
    佳能G系列领军相机G1X
    选购单反相机的新建议——心民谈宾得K5(转)
  • 原文地址:https://www.cnblogs.com/neuzk/p/9476413.html
Copyright © 2011-2022 走看看