首页 > 代码库 > Android设计模式(2)-----观察者模式
Android设计模式(2)-----观察者模式
观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中有四个角色:
抽象主题:它是一个接口。它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。其中有三个抽象方法:
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; } @Override public void Notify() { for (JobStation o : observers) { o.Update(); } } @Override public void Attach(JobStation observer) { // TODO Auto-generated method stub observers.add(observer); } @Override public void Detach(JobStation observer) { // TODO Auto-generated method stub observers.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; } @Override public 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; } @Override public 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; } @Override public void Update() { if (customer.CustomerState().equals("已付款")) { Log.d("ccccccc", "我是配送员,我来发货"); dillivierymanState = "已发货"; } } }
写到这里基本上也就写完啦,希望对大家有所帮助。
Android设计模式(2)-----观察者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。