观察者模式实际上是一种发布-订阅模式,多个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); } }
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109