设计模式之观察者模式

杨哥说观察者设计模式,通俗易懂,只要看图和例子即可。

//通知者接口

package guanchazhe_designmode;

//抽象观察者

public abstract  class Observer {

protected String name;

    protected Subject sub;

    public Observer(String name, Subject sub)

    {

        this.name = name;

        this.sub = sub;

    }

    public abstract void Update();

}

//抽象观察者

package guanchazhe_designmode;

//抽象观察者

public abstract  class Observer {

protected String name;

    protected Subject sub;

    public Observer(String name, Subject sub)

    {

        this.name = name;

        this.sub = sub;

    }

    public abstract void Update();

}

两个被观察者对象

class Secretary implements Subject

{

    //同事列表

    private List<Observer> observers = new ArrayList<Observer>();

    private String action;//前台状态

    public List<Observer> getObservers() {

return observers;

}

public void setObservers(List<Observer> observers) {

this.observers = observers;

}

public String getAction() {

return action;

}

public void setAction(String action) {

this.action = action;

}

//增加

    public void Attach(Observer observer)

    {

        observers.add(observer);

    }

    //减少

    public void Detach(Observer observer)

    {

        observers.remove(observer);

    }

    //通知

    public void Notify()

    {

        for(Observer o : observers){

         o.Update();

        }

            

    }

    @Override

public String getSubjectState() {

// TODO 自动生成的方法存根

return getAction();

}

    

   

}

class Boss implements Subject

{

    //同事列表

private List<Observer> observers = new ArrayList<Observer>();

    public List<Observer> getObservers() {

return observers;

}

public void setObservers(List<Observer> observers) {

this.observers = observers;

}

public String getAction() {

return action;

}

public void setAction(String action) {

this.action = action;

}

private String action;//老板状态

    //增加

    public void Attach(Observer observer)

    {

        observers.add(observer);

    }

    //减少

    public void Detach(Observer observer)

    {

        observers.remove(observer);

    }

    //通知

    public void Notify()

    {

      for(Observer o : observers){

          o.Update();

         }

             

    }

@Override

public String getSubjectState() {

// TODO 自动生成的方法存根

return getAction();

}

    

}

观察者对象(也可以理解为订阅用户)

//看股票的同事

class StockObserver extends Observer

{

    public StockObserver(String name, Subject sub)

       {

     super(name, sub);

    }

    public void Update()

    {

     System.out.println("关闭股票行情,继续工作!"+sub.getSubjectState()+""+name);

       

    }

}

//看NBA的同事

class NBAObserver extends Observer

{

    public NBAObserver(String name, Subject sub)

       

    {

     super(name, sub);

    }

    public  void Update()

    {

     System.out.println("关闭NBA直播,继续工作!!"+sub.getSubjectState()+""+name);

       

    }

}

//程序入口

public static void main(String[] args) {

// TODO 自动生成的方法存根

Operation oper;

oper=(new FactoryMian()).new OperationFactory().createOperate("+");

oper.set_numberA(1);

oper.set_numberB(2);

double result=oper.getResult();

System.out.print(result);

}

执行效果:

观察者原理:

      关键对象是主题Subject和观察者Oberver,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道是它的观察者,也就是说,具体的观察者是谁,它根本不需要知道。而任何一个具体的观察者不知道耶不需要知道其他观察者的存在。就这么简单,不用多说

       在Android开发中其实有好多的场景设计都使用了观察者模式,比如按钮事件事件的触发其实也用了这个设计模式,rxjava也是等等,所以啊,有事没事就多多用用观察者模式啊。

原文地址:https://www.cnblogs.com/xinanheishao/p/6971482.html