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

先简单介绍一下观察者模式:在对象之间定义一对多的依赖,这样当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
相信大家对回调都非常熟悉了,这里可以把回调看作是观察者模式的一种特殊类型,即只有一个观察者。
下面用图来描述一下观察者和被观察者之间的关系:

home.png

张三,赵四,王五都订了牛奶。送奶工过来后通知他们过来取奶,这时某六看到,也想订奶,就和送奶工说以后也给我送。之后送奶工就给他们四人送奶。
home.png
某天张三不想喝奶了,就和送奶工说我不喝了,以后别给我送了。之后送奶工就只给赵四,王五,赵六送奶了
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<MyOberver> 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值