【编程素质】设计模式-观察者模式

来源:互联网 发布:jmeter数据库压力测试 编辑:程序博客网 时间:2024/05/18 01:34

1、什么是观察者模式:

 (1)概念:

    即:发布publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)。

定义了对象之间的一对多依赖,这样一来当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

 (2)用途:

通常被用来实现事件处理系统。

在实际应用中,如果一个事物改变了需要通知另一个事物此时就需要使用观察者来监控

 (3)实现:

i>Java内置的观察者模式。

是一个类。使用不方便

ii>自己实现。


①新建接口观察者。

②新建接口主题(被观察者)。

③观察者类实现观察者接口。(观察者可能有很多)

④被观察者实现主题接口。

⑤实例化被观察者(单例)  ->   实例观察者  ->  被观察者添加观察者   ->  数据变化后,被观察者调用notifyObserver()方法,通知所有观察者数据改变  ->  观察者接收到数据改变信息后处理。

 (4)注意:

①不要依赖于观察者被通知的次序。这违反了松耦合原则。

②被观察者和观察者之间松耦合。一个被观察者(主题)可以有很多观察者。

③被观察者(主题)是真正拥有数据的人,观察者是主题的依赖者,在数据变化时更新,这样可以得到更干净的OO设计。

④针对具体实现编程,回导致我们以后在增加或删除布告板时,必须修改程序。观察者模式,将改变的地方分离并封装,符合OO设计原则。

 (5)优缺点:

   优:

     1、实现观察者和被观察者之间的松耦合

     2、支持一对多通知,只要是注册过的观察者都能收到通知

   缺:

     1、可能需要调用多次都能收到所需要的全部数据

     2、也可能会有多余的数据


2、经典应用

  观察者模式在android系统中的应用还是相当广泛的,如监听器、BroadcastReceiver。

3、demo

/** * 被观察者 * @author luo */public interface Watched_net {/** * 增加观察者 * @param watcher_net */public void add(Watcher_net watcher_net);/** * 移除观察者权限 * @param watcher_net */public void remove(Watcher_net watcher_net);/** * 可以实现行为并向观察者传输信息 * @param s */public void notifyWatcher(String s);}
public interface Watcher_net {    /**     * 用来获取更新信息接收的方法       * 观察到新的变化后,做什么动作     * @param content     */    public void updateNotify(String s); }
/** * 被观察者 观察是否有网络切换 *  * @author luo * */public class Net_switch implements Watched_net {/** use to Package Watcher_net */private List<Watcher_net> list = new ArrayList<>();/** 网络切换标志,内网为"i",外网为"e"; */private String Net_flag = "";final private static Net_switch net_switch = new Net_switch();public static Net_switch getInstance() {return net_switch;}private Net_switch() {}public String getNet_flag() {return Net_flag;}public void setNet_flag(String net_flag) {Net_flag = net_flag;}@Overridepublic void add(Watcher_net watcher_net) {list.add(watcher_net);}@Overridepublic void remove(Watcher_net watcher_net) {list.remove(watcher_net);}/** * 通知所有的观察者有新的变化 */@Overridepublic void notifyWatcher(String s) {for (Watcher_net watcher : list) {watcher.updateNotify(s);}}}
private void setWatcher() {Net_switch.getInstance().remove(GFragment.getInstance());Net_switch.getInstance().remove(CFragment.getInstance());Net_switch.getInstance().add(T.getInstance());}




0 0
原创粉丝点击