观察者模式(基础)

来源:互联网 发布:新西兰博士含金量知乎 编辑:程序博客网 时间:2024/04/30 17:56

观察者模式(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<Watcher> list = new ArrayList<Watcher>(); 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("吃饭啦");}}

输出



二、使用 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);}}

输出:


0 0
原创粉丝点击