大话设计模式——观察者模式

一.简单介绍

观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

二.原理结构图

逻辑图
Ob就是观察者的意思,Subject是被观察对象,我们把他们都定义一个抽象接口。
观察者(Observer)
将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。(这里的容器就是我们所说的集合,因为你一个被观察者可能有多个观察者在观察)
被观察
被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
注册观察
就是将观察者添加到容器中。

三.现实生活的应用

对于观察者设计模式的应用,虽然是一个老生常谈的场景,但比较一二,还是觉得微博的关注-通知功能再适合不过;
玩过微博的都知道,我们在关注某一个大V或者明星之后,微博在消息通知里,总会给你推送他的相关更新,实在是十分烦人。在这里面,我们充当的角色就是观察者,一个任人宰割的角色,一个别人靠我们盈利的角色,一个别人把我们卖了,我们还替别人数钱的角色。。。(所以说戏子最无情,没事别看微博,关注关注我啊,明星大腕会让你伤心,可我不会啊!!!)

四.代码实现

Observer接口(观察者)

public interface Observer {
    /**
     * 收到信息
     * @param s
     */
    void update(String s);
}

Subject接口(被观察者)

public interface Subject {
    void addFans(Observer observer);
    void removeFans(Observer observer);
    void nofify(String s);
}

VSubject类(观察者的实现类-微博大V)

public class VSubject implements Subject{
    List<Observer> observers = new ArrayList<>();
    @Override
    public void addFans(Observer observers) {
        this.observers.add(observers);
    }

    @Override
    public void removeFans(Observer observers) {
        this.observers.remove(observers);
    }

    @Override
    public void nofify(String s) {
        for (Observer observer : observers){
            observer.update(s);
        }
    }
}

FanObserver(观察者的实现类-我们)

public class FanObserver implements Observer{
    String name;
    public FanObserver(String name){
        this.name = name;
    }
    @Override
    public void update(String s) {
        System.out.println(name + "收到了消息"+s);
    }
}

测试类

public class WeiboTest {
    public static void main(String[] args){
        FanObserver fanObserver1 = new FanObserver("张三");
        FanObserver fanObserver2 = new FanObserver("李四");
        FanObserver fanObserver3 = new FanObserver("王二");
        FanObserver fanObserver4 = new FanObserver("赵武");

        VSubject vSubject = new VSubject();
        vSubject.addFans(fanObserver1);
        vSubject.addFans(fanObserver2);
        vSubject.addFans(fanObserver3);
        vSubject.addFans(fanObserver4);
        vSubject.nofify("厉害了");

        vSubject.removeFans(fanObserver1);
        vSubject.nofify("踢走一个人");
    }
}

五.实际开发中的优缺点分析

综上所述,Java编程中需要大量应用观察者模式的模型。观察者模式作为一种十分常用的设计模式,为我们的编写程序提供了便利。最后想总结一下观察者模式的优缺点。

优点:观察者与被观察者之间是一个轻度的关联关系,体现了模块的高内聚,低耦合。因此对于观察者和被观察者来说,要进行扩展就比较简单了。被观察者并不需要认识任何一个具体的观察者。它只需要提供一个观察者共同的接口即可。提高代码的可复用性。

缺点:在状态变化,观察者通知被观察者的时候,如果观察者过多,那么可能导致消息的传送失去实时性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值