设计模式:观察者模式

来源:互联网 发布:mac docker ycm 编辑:程序博客网 时间:2024/06/05 20:37

想象一个很常见的应用场景,当对象A在做某件事的时候,触发B做某件事。这样一个功能很容易实现,最容易想到的有两种。
1.创建一个轮询角色;
2.在对象A中调用对象B;

1.创建一个轮询角色;
//被监视对象

Public interface IA{        Public void dosomethingA();}Public class ConcreteA implements IA{        Private Boolean isDoingA = false;        Public void dosomethingA()        {            “I am doing A”            isDoingA = true;        }        Public isDoingA()        {            Return isDoingA;        }        Public clear()        {            isDoingA = false;        }}

//反馈对象

Public interface IB{    Public void update();}Public class ConcreteB implements IB{    Public void update()    {        “update my self”    }}

//监视者

Class Spy extends Threads{        Private ConcertA m_concertA;Private ConcertB m_concertB;//监视者要绑定监视的对象和要反馈的对象Public Spy(ConcertA _concertA, ConcertB _concertA){    This. m_concertA = _concertA;This. m_concertB= _concertB;}
Public void run(){    While(true)    {        If(this.m_concertA.isDoingA())        {            This.concertB.update();This.concertA.clear();}}}}

3.在对象A中调用对象B;
去掉spy对象

Public class ConcreteA implements IA{        ConcertB m_concertB = new ConcertB();        Public void dosomethingA()        {            “I am doing A”m_concertB.update();}}

以上两种方法存在的共同缺陷是当需要通知多个观察者的时候,到需要在上述源码中进行修改,严重违反的开闭原则(对修改关闭,对扩展开放)

于是提出观察者模式解决上述问题:

Public interface Observable{    Public void addObserver(Observable observable);    Public void deleteObserver(Observable observable);    Public void notifyObservers(Srting context);}public interface Oberver{    public void update();}Public class ConcreteA implements IA, Observable{        Private Arraylist<Observer> observerlist = new Arraylist<Observer>()        Public void dosomethingA()        {            “I am doing A”            This.notifyObservers(“A is doing A”);        }        Public void addObserver(Observable observable)        {            This. Observerlist.add(observable);        }        Public void deleteObserver(Observable observable)        {            This. Observerlist.remove(observable);        }        Public void notifyObservers(Srting context)        {            For(Observer observer:observerlist)            {                Observer.update();            }        }}
0 0