设计模式---观察者模式

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


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


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


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便不再是观察者,全部它接收不到不论什么的股市行情了。


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


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

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


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

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

posted @ 2015-07-29 08:38  mengfanrong  阅读(184)  评论(0编辑  收藏  举报