观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题
对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中有四个角色:
抽象主题:它是一个接口。它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,
可以增加和删除观察者对象。其中有三个抽象方法:
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 = "已发货";
}
}
}
写到这里基本上也就写完啦,希望对大家有所帮助。