设计模式--6观察者模式

1.观察者模式(Observer Pattern)
也叫发布订阅模式,定义对象间一种,一对多的依赖关系,使得当,一个对象状态改变时,所有依赖它的对象都能得到通知,并被自动更新

2.类图如图


(1)Subject 被观查者
定义被观察者必须实现的职责。它必须能够,管理观察者(动态添加或删除观察者),通知观察者。

(2)ConcreteSubject 具体的被观察者

(3)Observer 观察者
接收到消息后,进行update(消息处理)操作

(4)ConcreteObserver 具体观察者

3.关键,一个被观察者最好不要同时是观察者,否则这个关系很难维护
(1)优点:
观察者和被观察者之间是抽象耦合,方便扩展
建立一套触发机制,触发链

(2)观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发
和调试就会比较复杂, 而且在Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响
整体的执行效率。 在这种情况下, 一般考虑采用异步的方式。

被观察者发生动作了, 观察者要做出回应, 如果观察者比较多, 而且处理时间比较长怎么办? 那就用异步呗(具体怎么异步)

代码:

Observable

package com.design.观察者模式;

/**
 * 
 * @author yafei.lv
 * 被观察者,要作的通知
 */
public interface Observable {
    
    void addObserver(Observer observer); //添加观察者
    
    void deleteObserver(Observer observer); //减少观察者
    
    void notifyObservers(String context);
}

ObservableMotion

package com.design.观察者模式;

/**
 * 
 * @author yafei.lv
 * 被观察者,要做的动作
 */
public interface ObservableMotion {
    
    void haveBreakFast(); // 吃饭
    
    void haveFun(); // 娱乐
}

ObservableImpl

package com.design.观察者模式;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author yafei.lv
 * 被观察者实现
 */
public class ObservableImpl implements Observable,ObservableMotion {
    
    public List<Observer> observers = new ArrayList<Observer>(); // 观察者列表
    
    
    @Override
    public void haveBreakFast() {
        notifyObservers("开始吃饭....");
    }

    @Override
    public void haveFun() {
        notifyObservers("开始娱乐....");
    }

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        observers.remove(observer);
    }

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

}

Observer

package com.design.观察者模式;

/**
 * 
 * @author yafei.lv
 * 观察者
 */
public interface Observer {
    void update(String context);
}

ObserverLiSi

package com.design.观察者模式;

public class ObserverLiSi implements Observer{

    @Override
    public void update(String context) {
         System.out.println("观察者李斯,报告,被监控者有了活动:" + context);
    }

}

ObserverZhaogao

package com.design.观察者模式;

public class ObserverZhaogao implements Observer{

    @Override
    public void update(String context) {
         System.out.println("观察者赵高,报告,被监控者有了活动:" + context);
         System.out.println("所以我也开始吃饭,赵高");
    }

}

场景类:

package com.design.观察者模式;

/**
 * 
 * @author yafei.lv
 * 场景类
 */
public class Main {
    public static void main(String[] args) {
        Observer observerLisi = new ObserverLiSi();
        Observer observerZhaogao = new ObserverZhaogao();
        
        ObservableImpl observable = new ObservableImpl();
        observable.observers.add(observerZhaogao);
        observable.observers.add(observerLisi);
        
        observable.haveBreakFast();
        observable.haveFun();
    }
}
原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5956548.html