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
原创粉丝点击