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

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

观察者模式:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

 

 

 

下面举一个具体例子:

两个观察者,BinaryObserver的update将setState传入的整数转换成二进制,OctaObserver则是转成八进制

 

interface Subject {       private List
observers; public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyAllObservers();}

 

public class ConcreteSubject implements Subject{       private List
observers = new ArrayList
(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void registerObserver(Observer observer){ observers.add(observer); } public void removeObserver(Observer observer){ int i = observers.indexOf(observer); if(i >= 0) observers.remove(i); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } }

 

abstract Observer {   public abstract void update();}
 
public class BinaryObserver implements Observer{  Subject subject;   public BinaryObserver(Subject subject){      this.subject = subject;      this.subject.attach(this);   }   @Override   public void update() {      System.out.println( "Binary String: "       + Integer.toBinaryString( subject.getState() ) );    }}

 

public class OctalObserver implements Observer{   Subject subject;   public OctalObserver(Subject subject){      this.subject = subject;      this.subject.attach(this);   }   @Override   public void update() {     System.out.println( "Octal String: "      + Integer.toOctalString( subject.getState() ) );    }}

 

测试代码:

Subject subject = new ConcreteSubject();Observer o = new OctalObserver(subject);Observer b = new BinaryObserver(subject); subject.registerObserver(o); subject.registerObserver(b);subject.setState(15);subject.setState(10);

 

在Swing中有使用到观察者模式,比如JButton的addActionListener方法。

转载于:https://www.cnblogs.com/13jhzeng/p/5548154.html

你可能感兴趣的文章
【PM&数据】如何正确地利用产品数据【上】
查看>>
安装DNS服务器
查看>>
DPM2012学习(一),安装DPM2012
查看>>
文件迁移:将/home迁移到一个独立分区中
查看>>
python脚本按表备份MySQL数据库
查看>>
nio Selector 阻塞 唤醒 原理
查看>>
左旋转字符串
查看>>
android StringBuffer类的使用
查看>>
JSP/Servlet及相关技术详解(二)
查看>>
自动点胶机点胶不良率高是什么原因?
查看>>
Win2003中配置FTP服务,开启防火墙导致客户端无法连接【精华详解】
查看>>
【云计算】Linux从入门到精通
查看>>
oracle 解锁用户
查看>>
Hibernate与Mybatis/iBatis的区别
查看>>
Java源码学习之:Semaphore
查看>>
林仕鼎谈架构设计与架构师
查看>>
操作系统CnetOS_7—systemd管理实践指南
查看>>
cocos2d-x滚屏简单实现
查看>>
我的友情链接
查看>>
ThinkPHP的where方法的in操作符说明
查看>>