您的位置:首页 > 编程语言 > Java开发

java设计模式-观察者(发布-订阅)模式

2017-09-22 10:16 896 查看
接口1 被观察者(主题)接口

// 抽象主题角色,watched:被观察

public interface Watched {

    public void addWatcher(Watcher watcher);//添加一个观察者

    public void removeWatcher(Watcher watcher);//删除一个观察者

    public void notifyWatchers(String str);//唤醒所有的观察者

}

接口2 观察者 当发现主题有什么 变换时他的update方法会被调用

// 抽象观察者角色 Watcher:观察者

public interface Watcher {

    public void update(String str);//被唤醒后进行一些逻辑处理

}

实现接口类1 观察者的实现类 其中实现了观察者接口

// 具体的观察者

public class ConcreteWatcher implements Watcher {

    @Override

    public void update(String str) {

        //观察者进行逻辑处理

        System.out.println(str);

    }

}

实现接口类2 实现被观察者接口 

import java.util.ArrayList;

import java.util.List;

// 被观察者 主题

public class ConcreteWatched implements Watched {

    // 存放观察者 一个被观察者中存在多个观察者  所有需要一个集合

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

    @Override

    public void addWatcher(Watcher watcher) {

        list.add(watcher);

    }

    @Override

    public void removeWatcher(Watcher watcher) {

        list.remove(watcher);

    }

    @Override

    public void notifyWatchers(String str) {

        // 自动调用实际上是主题进行调用的

        for (Watcher watcher : list) {

            watcher.update(str);

        }

    }

}

测试主方法

public class TestMain {

    public static void main(String[] args) {

        Watched girl = new ConcreteWatched(); 创建一个被观察者

        //该被观察者存在多个观察者 

        Watcher watcher1 = new ConcreteWatcher();

        Watcher watcher2 = new ConcreteWatcher();

        Watcher watcher3 = new ConcreteWatcher();

        //将多个观察者 存放至被观察者对象集合内

        girl.addWatcher(watcher1);

        girl.addWatcher(watcher2);

        girl.addWatcher(watcher3);

        //唤醒当前被观察者内的所有的观察者

        girl.notifyWatchers("开心");

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: