設計模式之-觀察者(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汪、汪、汪

是不是很有意思,很有事件驅動的感覺。

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