13.观察者模式

2018-03-20  本文已影响0人  0x70e8

1.是什么

观察者定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个对象主题,当这个对象发送变化(执行什么方法了),会通知所有的观察者,观察者会做出对应的action。
此模式也叫发布-订阅模式,监听者就是订阅者,被监听者是发布者,也就是主题。

2.怎么用

比较简单,直接看示例代码。

/*
主题接口
*/
import java.util.ArrayList;
import java.util.List;

public abstract class Subject {

    private List<IObserver> listeners = new ArrayList<>();

    public void addListener(IObserver listener) {
        listeners.add(listener);
    }

    public void removeListener(IObserver listener) {
        listeners.remove(listener);
    }

    public void clearListener() {
        listeners.clear();
    }

    void notifyListener() {
        for (IObserver o : listeners) {
            o.action();
        }
    }

    /**
     * @return the listeners
     */
    public List<IObserver> getListeners() {
        return listeners;
    }

    public abstract void startWork();

}


/**
 * 主题实现类
 *
 */
public class TVSubject extends Subject {

    @Override
    public void startWork() {
        notifyListener();
        System.out.println("开始看电视");

    }

}


// 观察者接口
public interface IObserver {

    public void action();
}

// 观察者实现
public class WatchTVObeserver implements IObserver {

    @Override
    public void action() {
        System.out.println("告诉家长他又在看电视");

    }

}

// client
/**
 * 观察者模式</br>
 * 观察到一看电视就通知家长</br>
 * 作用类似于局部的拦截器</br>
 * 拦截某个具体方法 </br>
 * 只是拦截器可能是使用动态代理等实现,属于动态拦截</br>
 * 
 * @author shaoyuxia
 *
 */
public class Client {

    public static void main(String[] args) {
        IObserver ad = new WatchTVObeserver();
        TVSubject sub = new TVSubject();
        sub.addListener(ad);
        sub.addListener(new IObserver() {

            @Override
            public void action() {
                System.out.println("开始跳出弹窗");

            }
        });
        sub.startWork();

    }

}
上一篇 下一篇

猜你喜欢

热点阅读