zoukankan      html  css  js  c++  java
  • java设计模式之观察者模式(9)

    Java观察者模式的浅析

    简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

    在观察者模式里有如下的角色:

    抽象主题(Subject)角色:

    主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;

    抽象观察者(Observer)角色:

    为所有的具体观察者定义一个接口,在得到通知时更新自己;

    具体主题(ConcreteSubject)角色:

    保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色

    具体观察者(ConcreteObserver)角色:

    保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。

    继承关系(此实例简化了abstract subject类):

    代码实现:

    (1)创建Subject类

    package study_02.designpattern.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Create <strong>Subject</strong> class.
     * @author WWX
     *
     */
    public class Subject {
    	
       private List<Observer> observers 
          = new ArrayList<Observer>();
       private int state;
    
       public int getState() {
          return state;
       }
    
       public void setState(int state) {
          this.state = state;
          notifyAllObservers();
       }
    
       public void attach(Observer observer){
          observers.add(observer);		
       }
    
       public void notifyAllObservers(){
          for (Observer observer : observers) {
             observer.update();
          }
       } 	
    }

    (2)创建Oberver抽象类或接口

    package study_02.designpattern.observer;
    /**
     * Create <strong>Observer</strong> class
     * @author WWX
     *
     */
    public abstract class Observer {
    	protected Subject subject;
    
    	public abstract void update();
    }

    (3)创建继承了Oberver接口Concrete Oberver类

    package study_02.designpattern.observer;
    /**
     *  Create <strong>concrete observer</strong> classes
     * @author WWX
     *
     */
    public class BinaryObserver extends Observer {
    
    	public BinaryObserver(Subject subject) {
    		this.subject = subject;
    		this.subject.attach(this);
    	}
    
    	@Override
    	public void update() {
    		System.out.println("Binary String: "
    				+ Integer.toBinaryString(subject.getState()));
    	}
    }
    package study_02.designpattern.observer;
    /**
     *  Create <strong>concrete observer</strong> classes
     * @author WWX
     */
    public class HexaObserver extends Observer {
    
    	public HexaObserver(Subject subject) {
    		this.subject = subject;
    		this.subject.attach(this);
    	}
    
    	@Override
    	public void update() {
    		System.out.println("Hex String: "
    				+ Integer.toHexString(subject.getState()).toUpperCase());
    	}
    }
    package study_02.designpattern.observer;
    /**
     * Create <strong>concrete observer</strong> classes
     * @author WWX
     */
    public class OctalObserver extends Observer {
    
    	public OctalObserver(Subject subject) {
    		this.subject = subject;
    		this.subject.attach(this);
    	}
    
    	@Override
    	public void update() {
    		System.out.println("Octal String: "
    				+ Integer.toOctalString(subject.getState()));
    	}
    }


    (4)使用Subject和Concrete Oberver对象

    package study_02.designpattern.observer;
    /**
     *
     * @author WWX
     */
    public class ObserverPatternDemo {
    	public static void main(String[] args) {
    		Subject subject = new Subject();
    
    		new HexaObserver(subject);
    		new OctalObserver(subject);
    		new BinaryObserver(subject);
    
    		System.out.println("First state change: 15");
    		subject.setState(15);
    		System.out.println("Second state change: 10");
    		subject.setState(10);
    	}
    }


     

     

     

     

  • 相关阅读:
    log4j配置详解
    elasticsearch6.0版本安装head插件
    JAVA笔记-如何将百万级数据高效的导出到Excel表单
    抽象方法为什么不能被private与static修饰
    vue利用promise实现连续弹框
    vue代码片段
    h5元素高度超出屏幕但不滚动
    css3动画
    vue 引入静态图片404
    ios windows.open()不能打开
  • 原文地址:https://www.cnblogs.com/pangblog/p/3315401.html
Copyright © 2011-2022 走看看