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

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

观察者模式(有时又被称为发布(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汪、汪、汪

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章