观察者模式

发布于 2020-06-11  357 次阅读


观察者模式实际上是一种发布-订阅模式,多个cli订阅(监听)了一个主题,当这个主题发生改变时,会通知所有订阅的cli,cli即使更新信息,如:zookeeper的watch机制

观察者模式的组成部分:

Subject(抽象主题):里面封装了一个注册列表,可以增加,删除观察者

ConcreteSubject(具体主题):该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注                                                                                                    册过的观察者发送通知

Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己

ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态

问题:

现在有一支中国银行发行的国家债券,小王和小晴分别卖了这一支国债,当这支国债涨跌超过0.3个百分点,就会发信息提醒他们是否                抛售

传统方法:定义一个债券Bond类,内部封装一个WQL,FUqin的引用变量,setA来更新值,display负责更新时通知,在display中调用updata方法

public class 传统方法 {
    public static void main(String[] args) {
   Bond a=new Bond(0.1);
   a.setA(0.4);
    }
}
class Bond{
    WQL wql;
    FUQIN fuqin;
    double a;//涨跌数
    public Bond(double a){
        this.a=a;
    }
public void setA(double a){
        this.a=a;
        if(a>0.3){
display();
        }
}
    public void display(){//这是推送方法,当值被修改set方法调用display,display将值推送给小王和小晴,也可以设置为拉取
        wql=new WQL();
        fuqin=new FUQIN();
        wql.updata(a);
        fuqin.updata(a);
    }
}

class WQL{
    double a;//涨跌数
public void updata(double a){
    this.a=a;
    System.out.println("小王的债券提示!!");
}}
class FUQIN{
    double a;//涨跌数
    public void updata(double a){
        this.a=a;
        System.out.print("小晴的债券提示!!!");
    }
}

弊端:当除了小王和小晴,还有其他人要买,Bond的引用会越来越多,代码冗余也多

观察者模式:减少订阅者和发布者的耦合,通过注册列表,如:传统方式当债券的涨幅变动,股票类会专门一个一个的通知,债券类必须封装每一个类的引用,代码冗余大,观察者模式,建立一个注册列表,买债券的在列表中注册添加,但值改变时,把列表中的对象取出通知,一对多,把多的用集合装起来

import java.util.ArrayList;

public class 观察者 {
    public static void main(String[] args) {
Bond n=new Bond();
n.add(new WQL());
n.add(new FUQING());
n.setS(100);

    }
}
 interface abBond{
  abstract public void add(observer a);
  abstract  public void remove(observer a);
  abstract public void nofyity();
}

class Bond implements abBond{
    int s;
    public void setS(int a){
        this.s=a;
        nofyity();
    }

     ArrayList<observer> list=new ArrayList();   //注册列表

    @Override
    public void add(observer a) {
    list.add(a);
    }

    @Override
    public void remove(observer a) {
     list.remove(a);
    }

    @Override
    public void nofyity() {
      for (observer a:list){
          a.updata(s);
      }
    }
}

interface observer{
    abstract public void updata(int a);
}

class WQL implements observer{
    int a;
    @Override
    public void updata(int a) //更新方法
    {
        this.a=a;
        if(a>3){
            pr(a);
        }
    }
    //把值打印
    public void pr(int a){
        System.out.println("小王债券更新!!!"+a);

    }
}

class FUQING implements observer{
    int a;
    @Override
    public void updata(int a) {
      this.a=a;
        if(a>3){
            pr(a);
        }
    }
    public void pr(int a){
        System.out.println("小王债券更新!!!"+a);

    }
}

 


路漫漫其修远兮,吾将上下而求索