Android设计模式(2)-----观察者模式
来源:互联网 发布:广告配音制作软件 编辑:程序博客网 时间:2024/06/06 06:49
观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题
对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中有四个角色:
抽象主题:它是一个接口。它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,
可以增加和删除观察者对象。其中有三个抽象方法:
Attach()向集合里面增加观察者对象
Detach()从集合中删除观察者对象
Notify()根据主题的变化更新集合中的观察者对象
具体主题:实现抽象主题,把状态存入具体主题,当具体主题发生改变,发出通知更新观察者的状态。重写抽象主题的三个方法:Attach()、
Detach()、Notify()
抽象观察者:为所有的观察者定义一个抽象类,在接到通知的时候更新自己:其中有一个抽象方法:
Update():接到通知的时候更新自己
具体观察者:继承抽象观察者,重写其要求的接口iu,更新自己,以便使自己和主题的状态相一致。重写父类的抽象方法:Update()
它们四者的关系可用下图表示:
下面让我们来分析一个实例:
买东西时,顾客付钱之后,出纳需要入账、会计开票、配送员发货这三个工作时同时进行的。
我们来看看代码:
抽象主题:
/** * 抽象主题:它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。 *抽象主题提供一个接口,可以增加和删除观察者对象。 * @createTime:2014-10-28 下午3:31:44 */public interface ISubject {List<JobStation> observers = new ArrayList<JobStation>();/** * 增加观察者 */void Attach(JobStation observer);/** * 移除观察者 */void Detach(JobStation observer);/** * 向观察者(们)发出通知 */void Notify();}
具体主题:这里是顾客作为具体主题
/** * 具体主题,这里是客户:将有关状态存入具体观察者对象; *在具体主题内部状态改变时,给所有登记过的观察者发出通知 * * @createTime:2014-10-28 下午3:31:57 */public class Customer implements ISubject {public String customerState;/** * 客户状态 */public String CustomerState() {return customerState;}@Overridepublic void Notify() {for (JobStation o : observers) {o.Update();}}@Overridepublic void Attach(JobStation observer) {// TODO Auto-generated method stubobservers.add(observer);}@Overridepublic void Detach(JobStation observer) {// TODO Auto-generated method stubobservers.remove(observer);}}
抽象观察者:
/** * 工作岗位,作为这里的抽象观察者:为所有的具体观察者定义一个接口,在得到主题通知时更新自己 * @createTime:2014-10-28 下午3:31:34 */public abstract class JobStation {/** * 更新状态 */public abstract void Update();}具体观察者:出纳员
/** * 出纳,作为这里的具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调 * @createTime:2014-10-28 下午3:41:08 */public class Cashier extends JobStation {private String cashierState;private Customer customer;public Cashier(Customer customer) {this.customer = customer;}@Overridepublic void Update() {if (customer.CustomerState().equals("已付款")) {Log.d("ccccccc", "我是出纳员,我给登记入账");cashierState = "已入账";}}}
具体观察者:会计
/** * 会计,作为这里的具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调 * @createTime:2014-10-28 下午3:41:08 */public class Accountant extends JobStation {private String accountantState;private Customer customer;public Accountant(Customer customer) {this.customer = customer;}@Overridepublic void Update() {if (customer.CustomerState().equals("已付款")) {Log.d("ccccccc", "我是会计,我来开具发票");accountantState = "已开发票";}}}
具体观察者:配送员
/** * 配送员,作为这里的具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调 * @createTime:2014-10-28 下午3:41:08 */public class Dilliveryman extends JobStation {private String dillivierymanState;private Customer customer;public Dilliveryman(Customer customer) {this.customer = customer;}@Overridepublic void Update() {if (customer.CustomerState().equals("已付款")) {Log.d("ccccccc", "我是配送员,我来发货");dillivierymanState = "已发货";}}}
写到这里基本上也就写完啦,希望对大家有所帮助。
7 0
- Android设计模式(2)-----观察者模式
- Android设计模式(十一)-观察者模式
- Android观察者设计模式
- java/android 设计模式学习笔记(2)---观察者模式
- Java/Android 设计模式系列(2)--观察者模式
- android设计模式-观察者模式
- Android设计模式--观察者模式
- Android设计模式---观察者模式
- Android设计模式-观察者模式
- Android设计模式-----观察者模式
- Android设计模式--观察者模式
- 设计模式-2-观察者模式(2)
- 设计模式-2-观察者模式(1)
- C#设计模式- 观察者模式(2)
- 设计模式2 观察者模式
- 设计模式(2)--观察者模式
- 设计模式-2-观察者模式
- 设计模式-观察者模式2
- popupwindow的用法
- vs设计界面出现“建控件时出错 响应在此上下文中不可用”
- 标准爬虫初探,来自Python之父的大餐!
- UIBarButtonItem 边缘问题小记
- Element与Node的区别,children与childNodes的区别
- Android设计模式(2)-----观察者模式
- 票据已汇款 风险解除无法变更状态为“结清”
- Netfilter NF_HOOK执行流程分析 内核kprobe机制中的Jprobe机制 drop_watch hook_inspector
- 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
- SQL SERVER AGNET作业达到上限
- Android实习札记(3)---Fragment用app包还是v4包解析
- spring源码阅读(六)之BeanDefinition的载入
- 数据结构实验之求二叉树后序遍历和层次遍历
- php导出CSV时,超长数字精度丢失问题与前导0的字符串丢失0的问题解决