java基础与进阶web攻城狮设计模式

设计模式—观察者模式

2016-06-08  本文已影响793人  HJXANDHMR

今天我们来学习一种行为型模式,观察者模式(Observer Pattern)。

模式定义

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

模式结构

观察者模式包含如下角色:

**Subject: ** 目标
**ConcreteSubject: ** 具体目标
**Observer: ** 观察者
**ConcreteObserver: ** 具体观察者

UML图

代码实现

Subject.java

/**
 * 抽象目标者
 */
public abstract class Subject {

    // 保存注册的观察者对象
    private List<Observer> mObservers = new ArrayList<>();

    //注册观察者对象
    public void attach(Observer observer) {
        mObservers.add(observer);
        System.out.println("Attached an observer");
    }

    //注销观察者对象
    public void detach(Observer observer) {
        mObservers.remove(observer);
    }

    // 通知所有注册的观察者对象
    public void nodifyObservers(String newState) {
        for (Observer observer : mObservers) {
            observer.update(newState);
        }
    }
}

ConcreteSubject.java


/**
 * 具体目标者
 */
public class ConcreteSubject extends Subject {

    private String state;

    public String getState() {
        return state;
    }

    public void change(String newState) {
        state = newState;
        System.out.println("ConcreteSubject State:" + state);

        //状态发生改变,通知观察者
        nodifyObservers(state);
    }
}

Observer.java


/**
 * 观察者
 */
public interface Observer {

    void update(String state);
}

ConcreteObserver.java


/**
 *具体观察者
 */
public class ConcreteObserver implements Observer {

    // 观察者状态
    private String observerState;

    @Override
    public void update(String state) {
        // 更新观察者状态,让它与目标状态一致
        observerState = state;
        System.out.println("ConcreteObserver State :" + observerState);
    }
}

测试类

public class MyClass {

    public static void main(String[] args) {
        // 创建目标对象
        ConcreteSubject concreteSubject = new ConcreteSubject();
        // 创建观察者对象
        Observer observer = new ConcreteObserver();
        // 将观察者对象注册到目标对象上
        concreteSubject.attach(observer);
        // 改变目标对象的状态
        concreteSubject.change("I change");
    }
}

运行结果

模式分析

观察模式的优点

观察模式的缺点

本博客同步发表在 http://hjxandhmr.github.io/2016/06/08/DesignPattern-Observer/

参考
http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html

上一篇 下一篇

猜你喜欢

热点阅读