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

    1.  观察者模式: 

         观察者模式,也叫发布/订阅模式,定义如下:

         定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态改变时,多有依赖于它的对象都能及时得到通知并被自动更新

    2.  观察者模式的相关角色介绍:

         a、 抽象被观察者角色 

         定义被观察者必须实现的职责,它必须能够动态地添加和取消观察者,一般由抽象类构成。仅完成被观察者的职责:管理观察者并通知观察者

         b、 具体被观察者角色

         定义被观察者自己的业务逻辑,同时定义对那些事件发出通知

         c、 抽象的观察者角色

         观察者接收到消息之后进行update操作,即对收到的信息进行处理

         d、 具体的观察者角色

         每个观察者接收到消息之后处理的反应不同,每个观察者都有自己的处理逻辑

    3.   观察者模式通用示例代码:

    抽象被观察者类:

    /**
     * 抽象主题角色类,也称为抽象主题被观察者
     * @author zqkj001
     *
     */
    public abstract class Subject {
        
    	
    	/**
    	 * 用来保存注册的注册的观察者对象
    	 */
    	private List<Observer> list=new ArrayList<Observer>();
    	
    	
    	/**
    	 * 注册观察者对象到list
    	 * @param ob
    	 */
    	public void attach(Observer ob){
    		list.add(ob);
    		System.out.println("attach an observer..");
    	}
    	
    	/**
    	 * 删除观察者对象
    	 * @param ob
    	 */
    	public void detach(Observer ob){
    		list.remove(ob);
    	}
    	
    	/**
    	 * 通知所有注册的观察者对象
    	 * @param newState
    	 */
    	public void notifyObservers(String newState){
    		
    		for (Observer ob : list) {
    			 ob.update(newState);
    		}
    	}
    }
    具体被观察者类:

    /**
     * 具体主题角色类/具体主题被观察者类
     * @author zqkj001
     *
     */
    public class ConcreteSubject extends Subject {
          
    	private String state;
    
    	public String getState() {
    		return state;
    	}
    	
    	public void change(String newState){
    		this.state=newState;
    		System.out.println("主题状态更改为:"+this.state);
    		//状态发生改变,通知各个观察者
    		super.notifyObservers(this.state);
    	}
    }
    抽象观察者类

    /**
     * 抽象观察者角色类
     * @author zqkj001
     *
     */
    public interface Observer {
        
    	/**
    	 * 更新接口
    	 * @param newState
    	 */
    	public void update(String newState);
    }
    具体观察者类

    /**
     * 具体观察者角色类
     * @author zqkj001
     *
     */
    public class ConcreteObserver implements Observer {
        
    	private String observerState;
    	
    	@Override
    	public void update(String newState) {
    		//更新观察者状态,使其与目标状态一致
    		this.observerState=newState;
            System.out.println("状态为:"+this.observerState);
    	}
    
    }
    测试类:

    public class Client {
        
    	public static void main(String[] args) {
    		
    		//创建主题对象(被观察者)
    		ConcreteSubject subject=new ConcreteSubject();
    		
    		//创建观察者对象
    		Observer observer=new ConcreteObserver();
    		
    		//将观察者绑定到主题对象(被观察者)上
    		subject.attach(observer);
    		
    		//改变主题对象(被观察者)的状态 
    		subject.change("a new State");
    	}
    }

    4. 示例代码对应的类图:


    5. JDK对观察者模式的支持:

      JDK中提供了:java.util.Observable实现类和java.util.Observer接口,上面的代码中的一个抽象被观察者类和观察者接口可以分别用这2个替换。

      JDK调用示例:

    public class ConcreteSubject1 extends Observable {
         
    	public void operator(){
    		super.setChanged();
    		super.notifyObservers("改变了");
    	}
    }
    public class ConcreteObserver1 implements Observer {
    
    	@Override
    	public void update(Observable ob, Object str) {
    		
    		System.out.println("观察者接收到状态:"+str);
             
    	}
    
    }
    public class Test {
       
    	public static void main(String[] args) {
    		
    		ConcreteSubject1 ob=new ConcreteSubject1();
    		Observer observer=new ConcreteObserver1();
    		
    		ob.addObserver(observer);
    		
    		ob.operator();
    		
    	}
    }








         


  • 相关阅读:
    关于input输入框placeholder属性的样式问题
    关于input输入框checkbox类型的样式问题
    三层构架
    盒模型
    line height
    sql
    继承
    对象
    正则表达式
    事件
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293760.html
Copyright © 2011-2022 走看看