嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
观察者模式是一种对象行为模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。
明朝的锦衣服制度是一种特殊的政治制度,锦衣卫表面是上负责帮助皇帝管理仪仗,实际上是直属皇帝的特务机构,皇帝感觉哪个大臣有安全隐患,都会指挥锦衣卫派上一个眼线进行潜伏,暗中观察其一举一动,一旦有什么不好苗头,潜伏的眼线都会立马向上报告,锦衣卫马上出动进行逮捕、审讯。这一套流程下来,实际上就是观察者模式。如果写一个程序,怎么实现这个过程呢?
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("纵容部下强抢民女");
- }
- }
业务场景具有下面的特征就可以使用观察者模式:
有没有比较具体的业务场景示例呢?当然有,比如:
从某种角度来说,观察者模式与监听器模式可以理解是一会事,但是从具体的实现细节上来说,还是有一些区别:
总之,观察者模式是一种非常有效的行为型设计模式,但是在使用观察者模式时需要谨慎考虑其优缺点,并确保在实践中能够有效地应用这种设计模式。