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已下架!】
  • 相关阅读:
    uva 489 Hangman Judge(水题)
    中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)
    中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)
    poj 1039 Pipe(叉乘。。。)
    CodeForces 135 B. Rectangle and Square(判断正方形和 矩形)
    poj 1265 Area( pick 定理 )
    poj 2031 Building a Space Station(prime )
    hdu 4502 吉哥系列故事——临时工计划(dp)
    拉格朗日插值
    [USACO18DEC]The Cow Gathering P
  • 原文地址:https://www.cnblogs.com/neuzk/p/9476413.html
Copyright © 2011-2022 走看看