观察者模式

简单说两句

观察者模式,是对象行为型模式中的一种,有的时候人们也叫他发布/订阅模式。当我们需要在一个对象状态改变的时候通知到其它对象,这时候就可以考虑一下观察者模式。

细思不恐

观察者模式

  • ### 主旨

在设计模式中,观察者模式的主旨则是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  • ### 解惑

在上面我们说到,有时观察者模式也称发布/订阅模式,那到底有啥区别呢?其实发布订阅模式是处于广义上的观察者模式,因为他是最常用的一种观察者模式的实现。

发布订阅模式相对观察者多了一个事件的通道,因为在观察者模式中,观察者(Observer)需要直接订阅目标(Subject)事件,在目标发出内容更改事件时,直接接收内容事件并做出响应。在发布订阅模式中订阅者需要从时间的通道中订阅事件,这样从发布者接收事件以及向订阅者发布事件,两者并没有产生依赖的关系。

具体代码上的区别,有兴趣的朋友可以在下方留言,下次可以出一个小分支。

  • ### 实现方式

在上面的介绍中,我们大概知道了在观察者模式中,有这么两种主角色:

  • Subject(被观察者)

被观察者必须要有添加观察者、删除观察者和提醒观察者的方法。

  • Observer(观察者)

观察者要有更新方法,用来做出响应在状态改变调用提醒方法后。

Java中已经提供了观察者模式的实现,我们不需要再定义观察者和目标接口(被观察者),也不需要维护观察者的注册信息。可以继承Observable类实现被观察者目标对象,实现Observer接口完成具体的观察者对象,其中提供了update方法获取相应事件信息。

在这里为了方便说明观察者的基本原理,自己实现一个简单的案例。

首先抽象一个观察者类,里面有一个抽象方法更新状态。

public abstract class Oberver{
    public abstract void Update();
}

然后再写一个抽象被观察者类。

public abstract class Subject{
    //增加  
    public abstract void Attach(Observer observer);  
    //移除  
    public abstract void Detach(Observer observer);  
    //通知  
    public abstract void Notify();
}

具体上面两个类:

//具体的观察者  
public class ConcreteObserver  extends Observer{  

    @Override  
    public void Update() {
        System.out.println("状态改变,更新状态");  
    }
}  

//具体被观察者类  
public class ConcreteSubject extends Subject {  

    //定义集合存储观察者  
    List<Observer> list=new ArrayList<Observer>();  

    //增加观察者
    @Override  
    public void Attach(Observer observer) {  
        list.add(observer);  
    }  

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

    @Override  
    public void Notify() {  
        //遍历集合观察者对象  
        for(Observer observer:list){  
            observer.Update();  
        }
    }  
}  

接下来我们就可以写测试类了:

public class ObserverDemo {  
    public static void main(String[] args) { 

        //创建被观察者对象  
        ConcreteSubject csb=new ConcreteSubject();  
        //创建观察者对象
        ConcreteObserver cob=new ConcreteObserver();  

        //将观察者添加到被观察者的通知名单内  
        csb.Attach(cob);  

        //被观察者发出通知,观察者接受通知更新状态  
        csb.Notify();  
    }  
} 

//输出
“状态改变,更新状态”

就这样,一个简单的观察者模式的案例就结束了。当然一个复杂的应用中,我们肯定需要一个完整而且适用与多线程以及异步系统,因为观察者模式大都应用与这两中系统,所以也需要考虑线程安全的问题。下次会介绍更加详细完整的观察者的实现方式。

写在最后

因为每一篇的篇幅不宜过长,所以本打字员尽量在精简自己所写的内容,尽量能够多容扩一些知识点,但是具体的知识横向扩展可能就有一点欠缺,这也算是对自己的一种锻炼,希望大家能够一起进步,怎么样,在下面留个言吐槽一下本渣渣吧。(逃

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值