观察者模式

2018-09-19  本文已影响0人  笨笨翔

1. 模式动机

建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象相应作出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应对个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的动机。

2. 模式定义

观察者模式(Observer Pattern): 定义对象间的一种一对多依赖关系,使得每当一个对象发生改变时,其相关以来对象皆得到通知并被自动更新。观察者模式又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式
观察者模式是一种对象行为型模式。

3. 模式结构

观察者模式包含如下角色

4. 时序图

image

5. 代码分析

/**
 * 目标/通知者
 */
public abstract class Subject<T> {

    private List<Obeserver> list = new ArrayList<>();

    private T status;

    public void attach(Obeserver obeserver){
        list.add(obeserver);
    }
    public void detach(Obeserver obeserver){
        list.remove(obeserver);
    }

    private void notifyObeserver(){
        for(Obeserver obeserver : list)
            obeserver.update(status);
    }

    public void change(T status){
        this.status = status;
        notifyObeserver();
    }

}
/**
 * 具体主题/具体通知者
 */
public class ConcreateSubject extends Subject{}
/**
 * 抽象观察者
 */
public abstract class Obeserver<T> {
    public abstract void update(T status);
}
/**
 * 具体观察者
 */
public class ConcreateObeserver<T> extends Obeserver<T>{

    private String name;

    private Subject subject;

    ConcreateObeserver(String name){
        this.name = name;
    }

    private T subjectStatus;

    @Override
    public void update(T newStatus) {
        this.subjectStatus = newStatus;
        System.out.println("观察者:" + name + "的状态是" + newStatus);
    }
}
public class MainClass {
    public static void main(String[] args) {
        Subject<String> subject = new ConcreateSubject();

        Obeserver<String> obeserver1 = new ConcreateObeserver("张三");
        Obeserver<String> obeserver2 = new ConcreateObeserver("李四");

        subject.attach(obeserver1);
        subject.attach(obeserver2);

        subject.change("123123");

    }
}

运行结果:


image.png

6. 模式分析

7. 优点

8. 缺点

9. 适用环境

10. 模式应用

观察者模式在软件开发中应用非常管饭,如某电子上午网站可以在执行发送操作后给多个用户发送商品打折信息,某团队战斗游
戏中某队友牺牲将给所有成员提示等等,凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式。

11. 模式扩展

参考:图说设计模式

上一篇 下一篇

猜你喜欢

热点阅读