Skip to content

设计模式--观察者模式

芯笑

前言

甲人A(产品经理):好啊,你小子,又被我逮到了,很闲是吧😇,需求完成了吗? two days later…

芯不小:猫啊(自称),手速不够快啊!又被小甲逮到了。我苦心专研了数十载,开发了一个探A 【主题】,但是还缺一个app,不然你来试试😘

需求: 建立一个应用,事实汇报甲人A的方位,并传给芯不小和猫 【观察者】。 同时也是一个可扩展的,我们也要赚money嘛,只要支付一定的¥,我们就可以让更多人享受此服务

一、未使用设计模式

本着为人民服务的宗旨🤑,我义不容辞

public class Tana {

    private String position;
    public String getPosition() {
        return position;
    }
    public void positionChanged(){
        String loc=getPosition();
        user1.update(loc);
        user2.update(loc);
    }
}

芯不小:既然我们知道在未来会有许多的人订阅这项服务,也会有人取消,未来就不得不在代码中进行修改操作。而这就会大大增加代码的耦合度。不妨再改改😘

松耦合的强大之处 当两个对象之间松耦合,它们之间依然可以交互,但不太清除彼此的细节

二、观察者模式

1.定义

观察者模式定义了对象之间一对多的关系,这样一来,当一个对象改变状态时,它的所有依赖着都会收到并自动更新

2.组成

在这里插入图片描述

抽象观察者:

public interface Observer {
    public void update(String position);
}

具体观察者:

public class User implements Observer {
    // 订阅者名字
    private String name;
    public User(String name) {
        this.name = name;
    }
    @Override
    public void update(String position) {
        System.out.println(name + "-" + position);
    }

}

抽象主题:

public interface Subject {
    /**
     * 增加订阅者
     */
    public void attach(Observer observer);
    /**
     * 删除订阅者
     */
    public void detach(Observer observer);
    /**
     * 通知订阅者更新消息
     */
    public void notify(String position);
}

具体主题:

public class SubscriptionSubject implements Subject {
    //储存订阅用户
    private List<Observer> userlist = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        userlist.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        userlist.remove(observer);
    }

    @Override
    public void notify(String position) {
        for (Observer observer : userlist) {
            observer.update(position);
        }
    }
}
public class Client {
    public static void main(String[] args) {
        SubscriptionSubject subscriptionSubject=new SubscriptionSubject();
        //创建用户
        User user1=new User("猫");
        User user2=new User("芯不小");
        //订阅
        subscriptionSubject.attach(user1);
        subscriptionSubject.attach(user2);
        //发出消息
        subscriptionSubject.notify("甲A来了");
    }
}

找出变化的,和不变的分离: 在观察者模式中,主题的状态和观察者的数目、类型会改变。使用此模式,我们可以改变依赖于主题状态的对象,而不改变主题。 针对接口编程,而不针对实现编程: 主题和观察者都为接口,观察者利用主题的接口向主题注册,主题使用观察者接口(update) 通知观察者。具有了松耦合。 多用组合,少用继承: 观察者模式利用组合将许多的观察者和主题绑定,而不是通过继承产生的关系。

三、应用场景

四、优缺点

  

终于完成啦,芯啊,这副业不就🤑,嘿嘿 芯不小:猫啊,格局,格局

某天,甲人A的办公室传来了一个声音 猫,正在摸鱼… XXX,在浏览短视频网站…

分享
上一篇
设计模式--装饰者模式
下一篇
设计模式--策略模式