观察者模式(Observer)----行为笔记

来源:互联网 发布:linux查看cpu的线程数 编辑:程序博客网 时间:2024/06/04 18:38

观察者模式(Observer)----行为笔记

Observer模式:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新

 拓展:事件委托

一、涉及角色:

1、  抽象主题(Subject):把所有观察者对象保存在一个集合里,称为被观察者

ObServable)一般用抽象类实现,

2、  具体主题(ConcreteSubject):保存有关状态;在具体主题内部状态改变时,通知观察者。

3、  抽象观察者(Observer一般为接口;为所有具体观察者定义接口,

4、  具体观察者(ConcreteObserver):可以保存指向具体主题对象的引用。

二、  何时使用观察者模式

         1、当一个对象的改变需要同时改变其他对象,且它不知道具体有多少对象有待改变,

            2、一个抽象模型有两个方面,其中一方面依赖于另一方面,用观察者,可将这两方面封装在独立的对象中,使它们各自独立地改变和复用,

 

三、故事说明

OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

 

 

 

 

抽象被观察者

//抽象主题(被观察者)public abstract class Observable {Vector<Observer> observerList = new Vector<Observer>();//建了一个QQ群;public void addObserver(Observer o){observerList.add(o);}public void deleteObserver(Observer o){observerList.remove(o);}public void notifyObservers(){for(Observer observer : observerList){observer.update(this, null);}}}

 

具休主题(被观察者A)

//具休主题(被观察者A)public class ConcreteObserableB extends Observable {//小李他的 群定义为 //学习群,专门出集学习资料信息,并在群里共享,String message;public void foundInfo(String message) {//资料信息,并通知给群友this.message = message;notifyObservers();}@Overridepublic void notifyObservers() {for(Observer observer : observerList){observer.update(this, message);}}}


抽象观察者(Observer) 

//抽象观察者(Observer)public interface Observer {public void update(Observable o, Object arg);}

抽象观察者A(Observer) 

//抽象观察者A(Observer)public class ConcreteObserverA implements Observer{@Overridepublic void update(Observable o, Object arg) {//更新 来自群主的信息System.out.println("来自群主A:--->" + arg );}}


抽象观察者B(ObserverB)

public class ConcreteObserverB implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("来自群主B:--->" + arg );}}


客户端调用

public static void main(String[] args) {Observer observerA = new ConcreteObserverA();//观察者AObserver observerB = new ConcreteObserverB();//观察者BConcreteObserableA observableA = new ConcreteObserableA();   //被观察者A 小张ConcreteObserableB observableB = new ConcreteObserableB();   //被观察者B 小李observableA.addObserver(observerA);//观察者A加   小张群,获取(观察)群信息observableB.addObserver(observerB);observableA.foundGire("发现一个女生,在XX角落");observableB.foundInfo("java编程思想");}


打印信息:

                 来自群主A:--->发现一个女生,在XX角落
                 来自群主B:--->java编程思想 

 


 

0 0
原创粉丝点击