设计模式之-观察者(Observer)模式

来源:互联网 发布:域名系统dns的作用是 编辑:程序博客网 时间:2024/05/16 11:36

低耦合抽象化通过建立依赖关系来完成订阅。

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

我们可以把他看做简单的事件驱动实现方式

创建订阅接口,规范add remove 及 notice

package Observer;/** * 订阅管理器接口 *  * @author Allen * @date 2017年2月16日 * */public interface ISubscribe {    /**     * 添加订阅     *      * @param subs     * @author Allen     * @date 2017年2月16日     */    public void addSubscribe(ISubscriber subr);    /**     * 删除订阅     *      * @param subs     * @author Allen     * @date 2017年2月16日     */    public void removeSubscribe(ISubscriber subr);    /**     *      * 通知订阅变化     *      * @param content     * @author Allen     * @date 2017年2月16日     */    public void notice(String content);}

我们来实现这个订阅管理器

package Observer;import java.util.ArrayList;import java.util.List;/** * 订阅实现 *  * @author Allen * @date 2017年2月16日 * */public class SubscribeImple implements ISubscribe {    private List<ISubscriber> result = new ArrayList<ISubscriber>();    @Override    public void addSubscribe(ISubscriber subr) {        System.out.println(subr.getClass().getName()+"~~订阅了");        result.add(subr);    }    @Override    public void removeSubscribe(ISubscriber subr) {        result.remove(subr);    }    @Override    public void notice(String content) {        System.out.println("============所有订阅者听着============");        System.out.println(content);        System.out.println("=====================================");        for (ISubscriber temp : result) {            temp.msg(content);        }    }}

规范订阅者接口

package Observer;/** * 订阅者 *  * @author Allen * @date 2017年2月16日 * */public interface ISubscriber {    /**     * 新消息     */    public void msg(String content);}

我有3个订阅者,人,猫,狗

public class Cat implements ISubscriber {    @Override    public void msg(String content) {            System.out.println(this.getClass().getName()+"喵呜~~~~~~~~~~~");    }}
package Observer;/** *  * @author Allen  * @date 2017年2月16日 * */public class Dog implements ISubscriber {    @Override    public void msg(String content) {            System.out.println(this.getClass().getName()+"汪、汪、汪");    }}
package Observer;/** *  * @author Allen  * @date 2017年2月16日 * */public class Human implements ISubscriber {    @Override    public void msg(String content) {            System.out.println(this.getClass().getName()+"知道了");    }}

看看我们的main

     public static void main(String[] args)       {           //得到订阅管理器         ISubscribe subs = new SubscribeImple();           //人类猫咪狗狗全都订阅了         subs.addSubscribe(new Human());            subs.addSubscribe(new Cat());            subs.addSubscribe(new Dog());            ...         ...         //一段时间后管理器发送一条通知,给所有订阅者         subs.notice("这是一条通知,你们要各自履行义务");       }  

输出

Observer.Human~~订阅了Observer.Cat~~订阅了Observer.Dog~~订阅了============所有订阅者听着============这是一条通知,你们要各自履行义务=====================================Observer.Human知道了Observer.Cat喵呜~~~~~~~~~~~Observer.Dog汪、汪、汪

是不是很有意思,很有事件驱动的感觉。

0 0
原创粉丝点击