观察者模式(基础)

观察者模式(Observer)完美的将观察者和被观察的对象分离开。

观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。


该模式主要包括观察者和被观察者。当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。


一、自定义

参考博文

package pattern_observer;

public interface Watcher {
	public void update(String s);
}

package pattern_observer;

public interface Watched {
	public void addWatcher(Watcher watcher);
	public void removeWatcher(Watcher watcher);
	public void notifyWatchers(String s);
}

package pattern_observer;

public class ConcreteWatcher implements Watcher{
	public void update(String s){
		System.out.println(s);
	}
}

package pattern_observer;

import java.util.ArrayList;
import java.util.List;

public class ConcreteWatched implements Watched{
	private List list = new ArrayList(); 
	
	public void addWatcher(Watcher watcher){
		list.add(watcher);
	}
	
	public void removeWatcher(Watcher watcher){
		list.remove(watcher);
	}
	
	public void notifyWatchers(String s){
		for(Watcher w: list){
			w.update(s);
		}
	}
}

package pattern_observer;

public class Test {
	public static void main(String[] args) {
		Watched girl = new ConcreteWatched();
		
		Watcher watcher1 = new ConcreteWatcher();
		Watcher watcher2 = new ConcreteWatcher();
		Watcher watcher3 = new ConcreteWatcher();
		
		girl.addWatcher(watcher3);
		girl.addWatcher(watcher2);
		girl.addWatcher(watcher1);
		
		girl.notifyWatchers("吃饭啦");
	}
}

输出

观察者模式(基础)_第1张图片


二、使用 Java 包中的 Observable 类

package pattern_observer;

import java.util.Observable;

public class House extends Observable {
	private float price;
	
	public void setPrice(float price){
		this.setChanged();
		this.notifyObservers(price);
		this.price = price;
	}
	
	public float getPrice(){
		return this.price;
	}
	
	public House (float price){
		this.price = price;
	}
	
	public String toString(){
		return "房子价格为:" + this.price;
	}
}

package pattern_observer;

import java.util.Observable;
import java.util.Observer;

public class HousepriceObserver implements Observer{
	private String name;
	
	public HousepriceObserver(String name){
		super();
		this.name = name;
	}
	
	public void update(Observable o, Object arg){
		if(arg instanceof Float){
			System.out.println(this.name + "更改为" + ((Float)arg).floatValue());
		}
	}
}

package pattern_observer;

public class Demo {
	public static void main(String[] args) {
		House h = new House(10000);
		
		HousepriceObserver hpo1 = new HousepriceObserver("购房者A");
		HousepriceObserver hpo2 = new HousepriceObserver("购房者B");
		HousepriceObserver hpo3 = new HousepriceObserver("购房者C");
		
		h.addObserver(hpo1);
		h.addObserver(hpo2);
		h.addObserver(hpo3);
		
		System.out.println(h);
		
		h.setPrice(15000);
		
		System.out.println(h);
	}
}

输出:

观察者模式(基础)_第2张图片

你可能感兴趣的:(Java)