低耦合抽象化通過建立依賴關係來完成訂閱。
觀察者模式(有時又被稱爲發佈(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汪、汪、汪
是不是很有意思,很有事件驅動的感覺。