您的位置:首页 > 其它

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

2017-02-16 13:55 417 查看
低耦合抽象化通过建立依赖关系来完成订阅。

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


是不是很有意思,很有事件驱动的感觉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: