设计模式(Design pattern)之观察者模式(Observer Pattern)
本文介绍了观察者模式在拍卖场景中的应用实现。通过定义SubjectGoods主题接口和Observer观察者接口,构建了拍卖品与拍卖师之间的订阅关系。主题实现类SubjectGoodsReal维护观察者列表,提供订阅/取消订阅方法,并通过notify()方法通知所有观察者价格更新。观察者实现类Auctioneer在update()方法中处理价格更新通知。客户代码演示了创建拍卖品主题、添加多个拍卖师
·
观察者,观察「主题」对象的变化;并更新。
—— 我个人更愿意将观察者理解成 Subscription 订阅者,主题更新并通知订阅者,订阅者获得更新内容(content)。
看代码
主题接口
/**
* 观察者 - 主题抽象类 : 拍卖品
* @version 0.1
* @author BaiJing.biz
*/
public interface SubjectGoods {
// 观察者对象
void Subscribe(Observer observer);
// 删除观察者对象
void UnSubscribe(Observer observer);
// 通知观察者更新消息
void notify(int price);
}
主题对象
/**
* 观察者 - 主题实现类 : 拍卖品
* @version 0.1
* @author BaiJing.biz
*/
public class SubjectGoodsReal implements SubjectGoods{
// 存储观察者对象 —— 多个
private List<Observer> auctioneer = new ArrayList<Observer>();
@Override
public void Subscribe(Observer observer) {
auctioneer.add(observer);
}
@Override
public void UnSubscribe(Observer observer) {
auctioneer.add(observer);
}
@Override
public void notify(int price) {
for (Observer observer : auctioneer) {
// 拍卖品价格变化,更新给每一个拍卖者
observer.update(price);
}
}
}
观察者接口
/**
* 观察者 - 观察者抽象类 : 拍卖师
* @version 0.1
* @author BaiJing.biz
*/
public interface Observer {
void update(int price);
}
观察者对象
/**
* 观察者 - 观察者实现类 : 拍卖师
* @version 0.1
* @author BaiJing.biz
*/
public class Auctioneer implements Observer {
private String name;
public Auctioneer(String name) {
this.name = name;
}
@Override
public void update(int price) {
System.out.println("Auctioneer " + this.name + " is now buying " + price);
}
}
客户
public class CustomerRun {
public static void main(String[] args) {
SubjectGoodsReal goods = new SubjectGoodsReal();
goods.Subscribe(new Auctioneer("Tom"));
goods.Subscribe(new Auctioneer("Tian"));
goods.Subscribe(new Auctioneer("若水"));
goods.notify(10);
}
}

更多推荐


所有评论(0)