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

    观察者模式,或所谓的观察者模式。说白,对象之间的许多依赖,当一个对象的状态改变。这一切都取决于谁将会收到通知和更新自己主动。


    然后,我们可以定义以下三种接口:


    主题界面,是被观察的主题对象:


    package observer;
    
    public interface Subject {
    	public void registerObserver(Observer o);
    	public void removeObserver(Observer o);
    	public void notifyObservers();
    }
    



    观察者接口,当观察者发现主题对象状态改变时,要进行自身的更新:


    package observer;
    
    public interface Observer {
    	public void update(double value);
    }
    


    显示接口。被观察的主题数据须要通过某种方式显示出来:


    package observer;
    
    public interface Display {
    	public void display();
    }


    为方便起见,我们举例来解说。如果如今我们要观察股市行情,那么对于股市来说,全部股民的电脑或者股市行情的布告板就是它的观察者,而股市本身就是一个被观察的主题对象。


    那么我们能够非常清楚的有以下几个类的定义:


    股市行情类,也就是此时真正被观察的主题对象:


    package observer;
    import java.util.ArrayList;
    public class StockQuotation implements Subject{
    
    	private ArrayList<Observer> observers;
    	private double stockvalue;
    	
    	public StockQuotation(){
    		observers=new ArrayList<Observer>();
    	}
    	
    	public void registerObserver(Observer o) {
    		observers.add(o);
    	}
    	
    	public void removeObserver(Observer o) {
    		int i=observers.indexOf(o);
    		if(i>=0){
    			observers.remove(i);
    		}
    	}
    
    	public void notifyObservers() {
    		for(int i=0;i<observers.size();++i){
    			Observer observer=(Observer) observers.get(i);
    			observer.update(stockvalue);
    		}
    	}
    	
    	public void valueChanged(){
    		notifyObservers();
    	}
    	
    	public void setValue(double stockvalue){
    		this.stockvalue=stockvalue;
    		valueChanged();
    	}
    }
    


    布告板类。用于显示股市:


    package observer;
    
    public class BillBoard implements Observer, Display{
    
    	private double stockvalue;
    	private Subject stockQuotation;
    	
    	public BillBoard(Subject stockQuotation){
    		this.stockQuotation=stockQuotation;
    		stockQuotation.registerObserver(this);
    	}
    	
    	public void display() {
    		System.out.println("Current stock quotation: "+stockvalue);
    	}
    
    	public void update(double stockvalue) {
    		this.stockvalue=stockvalue;
    		display();
    	}
    	
    	public void deleteThisDisplay(){
    		this.stockQuotation.removeObserver(this);
    	}
    }
    




    最后就是主类:


    package observer;
    
    public class Main {
    	public static void main(String[] args){
    		StockQuotation stockQuotation = new StockQuotation();
    		BillBoard billBoard = new BillBoard(stockQuotation);
    		stockQuotation.setValue(2099.9);
    		billBoard.deleteThisDisplay();
    		stockQuotation.setValue(2090.9);
    	}
    }

    我们发现主类调用
    billBoard.deleteThisDisplay();

    之后布告板billBoard便不再是观察者,全部它接收不到不论什么的股市行情了。


    这种简单代码就实现了观察者模式。


    我们能够发现。当新类型的观察者出现时。主题的代码不须要改动。

    主题不在乎别的,仅仅会发送通知给全部实现了观察者接口的对象。


    主题和观众之间的松耦合,它是在观察者模式独特。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    javascript中new Date()的浏览器兼容性问题
    js 时间格式化
    HTML5 JS实现搜索匹配功能
    PHP中preg_match正则匹配的/u /i /s是什么意思
    微信开放接口获取用户昵称保存到MySQL中为空白
    linux下源码安装软件
    格式化MYSQL时间戳函数FROM_UNIXTIME
    Zabbix-proxy安装部署
    使用ss命令对tcp连接数和状态的监控性能优化
    Zabbix使用netstat监控会话
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4684926.html
Copyright © 2011-2022 走看看