博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式
阅读量:5329 次
发布时间:2019-06-14

本文共 2216 字,大约阅读时间需要 7 分钟。

观察者模式,应以一种一对多的依赖关系,当状态改变,自动通知其他依赖的对象。也就是发布订阅模式。

具体实现包括四个部分:

  • 抽象被观察者;
  • 被观察者角色;
  • 抽象观察者;
  • 观察者角色。

创建抽象观察者:

1 public interface Observer {2 3     void update(String msg);4 5     String getName();6 }

创建抽象被观察者:

1 public interface Subject {2 3     void attach(Observer observer);4 5     void detach(Observer Observer);6 7     void notifyObservers(String msg);8 }

创建两个观察者:

1 public class LancerObserver implements Observer { 2  3     private String name; 4  5     public LancerObserver(String name) { 6         this.name = name; 7     } 8  9     @Override10     public String getName() {11         return name;12     }13 14     @Override15     public void update(String msg) {16         System.out.println(name + " got msg " + msg);17     }18 }19 20 public class SaberObserver implements Observer {21 22     private String name;23 24     public SaberObserver(String name) {25         this.name = name;26     }27 28     @Override29     public void update(String msg) {30         System.out.println(name + " got msg " + msg);31     }32 33     @Override34     public String getName() {35         return name;36     }37 }

创建被观察者:

1 public class SanGrealSubject implements Subject { 2  3     List
observers = new ArrayList<>(10); 4 5 @Override 6 public void attach(Observer observer) { 7 observers.add(observer); 8 } 9 10 @Override11 public void detach(Observer target) {12 observers.removeIf(observer -> StringUtils.equalsIgnoreCase(observer.getName(), target.getName()));13 }14 15 @Override16 public void notifyObservers(String msg) {17 for (Observer observer : observers) {18 observer.update(msg);19 }20 }21 }

创建测试方法:

1 public class Main { 2  3     public static void main(String[] args) { 4         Subject subject = new SanGrealSubject(); 5  6         Observer saber = new SaberObserver("Arthur"); 7         Observer lancer = new LancerObserver("CuChulainn"); 8  9         subject.attach(saber);10         subject.attach(lancer);11         subject.notifyObservers("i am CuChulainn");12 13         subject.detach(lancer);14         subject.notifyObservers("why");15     }16 }

 

转载于:https://www.cnblogs.com/avalon-merlin/p/10516292.html

你可能感兴趣的文章
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
内存地址对齐
查看>>
创新课程管理系统数据库设计心得
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
管道,数据共享,进程池
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
php中的isset和empty的用法区别
查看>>
把word文档中的所有图片导出
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
arcgis api 4.x for js 结合 Echarts4 实现散点图效果(附源码下载)
查看>>
YTU 2625: B 构造函数和析构函数
查看>>
apache自带压力测试工具ab的使用及解析
查看>>
加固linux
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
js千分位处理
查看>>
字符串类型的相互转换
查看>>
基础学习:C#中float的取值范围和精度
查看>>