嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
观察者模式是一种对象行为模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。
明朝的锦衣服制度是一种特殊的政治制度,锦衣卫表面是上负责帮助皇帝管理仪仗,实际上是直属皇帝的特务机构,皇帝感觉哪个大臣有安全隐患,都会指挥锦衣卫派上一个眼线进行潜伏,暗中观察其一举一动,一旦有什么不好苗头,潜伏的眼线都会立马向上报告,锦衣卫马上出动进行逮捕、审讯。这一套流程下来,实际上就是观察者模式。如果写一个程序,怎么实现这个过程呢?
1、定义一个抽象的观察者,也就是锦衣卫,用来定义具体的职能,如逮捕、审讯等;
/**
*锦衣卫
*/
public interface JinYiWei {
/**
* 逮捕
*/
void arrest(String something);
}
2、定义一个抽象主题,也就是眼线,用来执行添加观察者、删除观察者、通知观察者;
/**
* 眼线
*/
public abstract class YanXian {
public List jinYiWeiList = new ArrayList();
/**
* 添加
*
* @param jinYiWei
*/
public void add(JinYiWei jinYiWei) {
this.jinYiWeiList.add(jinYiWei);
}
/**
* 移除
*
* @param jinYiWei
*/
public void remove(JinYiWei jinYiWei) {
this.jinYiWeiList.remove(jinYiWei);
}
public abstract void report(String something);
}
3、定义具体的主题,也就是皇帝的大臣,继承于抽象的主题,也就是眼线,大臣不管做什么事,都在被眼线的暗中观察着,并报告上级。
/**
* 尚书大人
*/
public class ShangShu extends YanXian {
private String name;
public ShangShu(String name) {
this.name = name;
}
public void doSomething(String something) {
System.out.println(this.name + something);
//观察者开始工作
this.report(this.name + something);
}
@Override
public void report(String something) {
for (JinYiWei jinYiWei : this.jinYiWeiList) {
jinYiWei.arrest(something);
}
}
}
4、定义具体的观察者,也就锦衣卫的XX千户、XX 指挥使,用来执行具体的职能任务,如逮捕、审讯等;
/**
* 锦衣卫千户大人
*/
public class QianHu implements JinYiWei {
private String name;
public QianHu(String name) {
this.name = name;
}
@Override
public void arrest(String something) {
System.out.println("报告皇帝:" + something);
System.out.println(this.name + "准备执行逮捕任务");
}
}
5、客户端
public class Client {
public static void main(String[] args) {
JinYiWei jinYiWei=new QianHu("锦衣卫的马千户");
ShangShu shangShu = new ShangShu("吏部的李尚书");
shangShu.add(jinYiWei);
shangShu.doSomething("写了一首反诗");
ShangShu shangshu2=new ShangShu("兵部的王尚书");
shangshu2.add(jinYiWei);
shangshu2.doSomething("买了十副盔甲");
}
}
最近朱皇帝收到风声,将军们开始骄奢淫逸了,甚至开始强抢民女了,于派安插眼线,暗中搜集罪证,一旦证据确凿,马上逮捕,怎么实现这个过程呢?
定义具体的主题,也就是皇帝的将军,继承于抽象的主题,也就是眼线,将军们不管做什么事,都在被眼线的暗中观察着,并报告上级。
/**
* 将军
*/
public class JiangJun extends YanXian{
private String name;
public JiangJun(String name) {
this.name = name;
}
public void doSomething(String something){
System.out.println(this.name+something);
this.report(this.name+something);
}
@Override
public void report(String something) {
for (JinYiWei jinYiWei : jinYiWeiList) {
jinYiWei.arrest(something);
}
}
}
public class Client {
public static void main(String[] args) {
JinYiWei jinYiWei=new QianHu("锦衣卫的马千户");
JiangJun jiangJun = new JiangJun("李将军");
jiangJun.add(jinYiWei);
jiangJun.doSomething("纵容部下强抢民女");
}
}
业务场景具有下面的特征就可以使用观察者模式:
有没有比较具体的业务场景示例呢?当然有,比如:
从某种角度来说,观察者模式与监听器模式可以理解是一会事,但是从具体的实现细节上来说,还是有一些区别:
总之,观察者模式是一种非常有效的行为型设计模式,但是在使用观察者模式时需要谨慎考虑其优缺点,并确保在实践中能够有效地应用这种设计模式。