观察者模式实际上是一种发布-订阅模式,多个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