Java中的设计模式 - 观察者模式【又叫:发布/订阅模式】

版权声明:本文为「简简单单 Online zuozuo」原创文章,非商业用途欢迎转载,请保持署名,注明出处! Java 交流QQ 群:172083832 ,欢迎大家加入! https://blog.csdn.net/qq_15071263/article/details/85562241

Java中的设计模式 - 观察者模式【又叫:发布/订阅模式】


1、观察者模式是为了解决什么问题

当我们在定义对象间的一种一对多的依赖关系,一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。

一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。所以使用观察者模式

2、核心逻辑

在抽象类中有一个注册观察者的List 对象

3、优点

1、观察者与被观察者是抽象耦合的
2、存在触发机制

4、缺点

1、如果某个被观察对象,拥有很多的观察者,则全部通知到会花费较多的时间
2、观察者与被观察者之间有可能存在循环依赖,导致系统宕机
3、观察者对于被观察者来说,是一个相对的黑箱,观察者只知道结果是这样,但是并不知道究竟是怎么变成这样的。

5、应用场景

1、发布/订阅
2、一个对象的状态变更,会影响到与他关联的对象
3、链式传递,一个对象的变更,会影响到与他关联的对象,而这个状态导致的关联变更,又会影响到关联对象的关联对象,那么可以设计一个链式观察模式来传递变更

6、构建观察者抽象类,抽离观察者属性
public abstract class Observer {
    protected Subject subject;
    public abstract void whileUpdate();
}

7、构建被观察者,主题
@Getter
public class Subject {


    private List<Observer> observers = Lists.newArrayList();

    private Object data;

    public void whileDataUpdated(Object data) {
        this.data = data;
        notifyAllObserbers();
    }


    /**
     * 新增一个观察者
     */
    public void newObserver(Observer observer) {
        observers.add(observer);
    }

    /**
     * 通知所以的观察者
     */
    public void notifyAllObserbers() {
        observers.forEach(Observer::whileUpdate);
    }
}
8、创建3个观察者 A B C
public class ObserverA extends Observer {



    public ObserverA(Subject subject) {
        this.subject = subject;
        this.subject.newObserver(this);
    }

    @Override
    public void whileUpdate() {
        System.out.println("我是A观察者,我监听到变化:" + subject.getData().toString());
    }
}




public class ObserverB extends Observer {


    public ObserverB(Subject subject) {
        this.subject = subject;
        this.subject.newObserver(this);
    }


    @Override
    public void whileUpdate() {
        System.out.println("我是B观察者,我监听到变化:" + subject.getData().toString());
    }
}


public class ObserverC extends Observer {


    public ObserverC(Subject subject) {
        this.subject = subject;
        this.subject.newObserver(this);
    }


    @Override
    public void whileUpdate() {
        System.out.println("我是C观察者,我监听到变化:" + subject.getData().toString());
    }
}

9、测试
public class Main {


    public static void main(String[] args) {
        Subject subject = new Subject();
        new ObserverA(subject);
        new ObserverB(subject);
        new ObserverC(subject);

        subject.whileDataUpdated("我注册了一张银行卡");
        subject.whileDataUpdated("我注销了一张银行卡");

    }
}
10、输出
我是A观察者,我监听到变化:我注册了一张银行卡
我是B观察者,我监听到变化:我注册了一张银行卡
我是C观察者,我监听到变化:我注册了一张银行卡
我是A观察者,我监听到变化:我注销了一张银行卡
我是B观察者,我监听到变化:我注销了一张银行卡
我是C观察者,我监听到变化:我注销了一张银行卡

猜你喜欢

转载自blog.csdn.net/qq_15071263/article/details/85562241