低耦合抽象化通过建立依赖关系来完成订阅。
观察者模式(有时又被称为发布(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汪、汪、汪
是不是很有意思,很有事件驱动的感觉。