java 设计模式 观察者_java设计模式-观察者模式详解

先简单介绍一下观察者模式:在对象之间定义一对多的依赖,这样当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

相信大家对回调都非常熟悉了,这里可以把回调看作是观察者模式的一种特殊类型,即只有一个观察者。

下面用图来描述一下观察者和被观察者之间的关系:

9ee823cd94a9

home.png

�张三,赵四,王五都订了牛奶。送奶工过来后通知他们过来取奶,这时某六看到,也想订奶,就和送奶工说以后也给我送。之后送奶工就给他们四人送奶。

9ee823cd94a9

home.png

某天张三不想喝奶了,就和送奶工说我不喝了,以后别给我送了。之后送奶工就只给赵四,王五,赵六送奶了

9ee823cd94a9

home.png

图画的不好,请大家忍住别笑,下面说一下送奶工(被观察者)的工作流程。

在这里张三,赵四,王五,某六都是观察者。在第一幅图片中某六并没有订奶,所以没有收到送奶工的通知。于是它和送奶工说我也要喝牛奶,就订阅了。

之后送奶工就给四个人送奶并通知他们。某天张三不想喝奶了,就告诉送奶工说我不想喝牛奶了,以后别送了。这时他就取消了订阅,之后送奶工就不再通知张三过来取奶了。

好了,图片介绍完了,下面上代码。

在这里将被观察者抽象为一个接口,这样当这个送奶工哪天不想做了的时候,我们可以立刻换个送奶工代替他去工作:

public interface Subject {

//注册观察者

void registerObserver(MyOberver o);

//移除观察者

void removeObserver(MyOberver o);

//通知观察者

void notifyObservers();

}

接下来定义观察者的接口,这里只有一个方法,取奶:

public interface MyOberver {

//取奶

void getMilk();

}

接下来,让送奶工 A实现subject:

public class A implements Subject {

//创建一个集合,管理观察者

private List observers;

public A(){

observers = new ArrayList<>();

}

@Override

public void registerObserver(MyOberver o) {

//每注册一个观察者�,将他加入观察者集合中

observers.add(o);

}

@Override

public void removeObserver(MyOberver o) {

//获得观察者在集合中的索引,并移除

int i = observers.indexOf(o);

if ( i >= 0){

observers.remove(i);

}

}

@Override

public void notifyObservers() {

//遍历集合中的观察者,并通知他们取奶

for(int i = 0; i < observers.size(); i++){

MyOberver oberver = observers.get(i);

oberver.getMilk();

}

}

}

然后定义被观察者:

public class Observer implements MyOberver {

private Subject milkStuff;

private String name;

public Observer(Subject milkStuff,String name) {

this.milkStuff = milkStuff;

//在构造方法中将当前对象注册当观察者集合中

milkStuff.registerObserver(this);

this.name = name;

}

@Override

public void getMilk() {

System.out.println("我是" + name + ",马上来取奶...");

}

}

最后写一个main方法测试就ok啦

public static void main(String[] args) {

A milkStuff = new A();

MyOberver zs = new Observer(milkStuff,"张三");

MyOberver ls = new Observer(milkStuff,"李四");

MyOberver ww = new Observer(milkStuff,"王五");

MyOberver ml = new Observer(milkStuff,"某六");

milkStuff.notifyObservers();

}

在这里我只是简单的阐述了观察者模式的原理,帮助大家弄懂这种优秀的设计模式。真正应用起来肯定会比这个例子复杂的多。

希望自己在成为大牛的路上愈行愈远,与大家共勉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值