观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

Subject类:

 package cn.happy.design_pattern._10publishsubscribe;

 import java.util.ArrayList;
import java.util.List; public class Subject { private List<Observer> observers = new ArrayList<>(); public void attach(Observer observer){
observers.add(observer);
} public void detach(Observer observer){
observers.remove(observer);
} public void mNotify(){
for (Observer item : observers) {
item.update();
}
}
}

Observer类:

 package cn.happy.design_pattern._10publishsubscribe;

 public abstract class Observer {

     public abstract void update();
}

ConcreteSubject类:

 package cn.happy.design_pattern._10publishsubscribe;

 public class ConcreteSubject extends Subject {

     private String subjectState;

     String getSubjectState() {
return subjectState;
} void setSubjectState(String subjectState) {
this.subjectState = subjectState;
} }

ConcreteObserver类:

 package cn.happy.design_pattern._10publishsubscribe;

 public class ConcreteObserver extends Observer {

     private String name;
private String observerState;
private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject, String name) {
this.subject = subject;
this.name = name;
} @Override
public void update() {
observerState = subject.getSubjectState();
System.out.println("观察者"+name+"的新状态是"+observerState);
}
//省略getter and setter
}

测试类:

 package cn.happy.design_pattern._10publishsubscribe;

 public class Mmain {

     public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.attach(new ConcreteObserver(subject, "X"));
subject.attach(new ConcreteObserver(subject, "Y"));
subject.attach(new ConcreteObserver(subject, "Z"));
subject.setSubjectState("ABC");
subject.mNotify();
} }

最新文章

  1. webpack 使用教程--实时刷新测试
  2. Linux rpm 查询
  3. ASP.NET MVC学习系列(一)-WebAPI初探
  4. Ubuntu查看系统的信息
  5. C++ Redis mset 二进制数据接口封装方案
  6. HDFS副本机制&amp;负载均衡&amp;机架感知&amp;访问方式&amp;健壮性&amp;删除恢复机制&amp;HDFS缺点
  7. NPOI--操作Excel之利器(一)
  8. erlang mnesia 数据库实现SQL查询
  9. LINUX环境并发服务器的三种实现模型
  10. Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)
  11. css文字与排版
  12. CSS 图像高级 CSS 渐变
  13. #221 Iterate Through an Array with a For Loop
  14. mysql练习----More JOIN operations
  15. Jenkins+PowerShell持续集成环境搭建(四)常用PowerShell命令
  16. Inline Route Constraints in ASP.NET Core MVC
  17. maven +bootstrap+ssm
  18. sklearn datasets模块学习
  19. 003-pro ant design 前端权限处理-支持URL参数的页面
  20. Hakase and Nano 【思维博弈】

热门文章

  1. python代码风格检查工具──pylint
  2. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程
  3. 如何构造请求处理对象链(Pipeline)
  4. WPF响应长按事件
  5. WPF异常捕获,并使程序不崩溃!
  6. Kivy A to Z -- Kivy 示例演示自带名单
  7. 【C++】【TinyXml】xml文件的读写功能使用——写xml文件
  8. Entity种类(动态代理)
  9. js 看图识国家
  10. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)