设计模式之观察者模式
2016-08-26 16:23
155 查看
一、详细介绍
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
二、举例实现
实现观察者模式的时候需要注意,观察者与被观察者对象之间的互动关系不能体现成类之间的直接调用关系,否则就将观察者与被观察者之间紧密的耦合起来,从根本上违反面向对象的设计原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。应该通过一种注册回调的形式来实现观察者模式。观察者往往是需要实现某个接口的,被观察者保存着这些被注册的观察者的信息(用List、Set等集合保存观察者对象),一旦发生变化则通过多态回调观察者接口的方法,从而达到低耦合的目的。import java.util.HashSet; //观察者模式 interface Observer{//观察者接口 public void update(Product p);//被观察者有更新时调用的 public void unreg(Product p);//撤销注册 } class WebObserver implements Observer{//Web观察者 @Override public void update(Product p) {//回调方法 System.out.println("New price: " + p.getName() + ":" + p.getPrice()); } @Override public void unreg(Product p) {//撤销注册 p.getObservers().remove(this); } } class MailObserver implements Observer{//邮箱观察者 @Override public void update(Product p) { System.out.println("Send this message: " + p.getName() + ":" + p.getPrice()); } @Override public void unreg(Product p) { p.getObservers().remove(this); } } class Product{//产品类,被观察者 private double price; //价格 private String name; //商品名称 private HashSet<Observer> observers;//保存所有观察者 public Product(String name, double price){//构造方法 this.price = price; this.name = name; observers = new HashSet<Observer>(); } public void addObserver(Observer obs){//添加观察者 observers.add(obs); } public void notifyObserver(){//通知观察者执行update()方法 for(Observer obs : observers) obs.update(this); } public double getPrice(){ return price; } public void setPrice(double price){ this.price = price; notifyObserver();//当价格变动时通知观察者 } public String getName(){ return name; } public void setName(String name){ this.name = name; } public HashSet<Observer> getObservers(){ return observers; } public void setObservers(HashSet<Observer> observers){ this.observers = observers; } } public class ObserverPattern { public static void main(String[] args) { Product p = new Product("《设计模式》", 100);//创建一个产品 Observer o1= new WebObserver(); //创建第一个观察者 Observer o2 = new MailObserver(); //创建第二个观察者 p.addObserver(o1); //添加观察者 p.addObserver(o2); //添加观察者 System.out.println("===第一次价格变动==="); p.setPrice(80); o1.unreg(p); System.out.println("===第二次价格变动==="); p.setPrice(75); } }
相关文章推荐
- 设计模式与泡mm的关系之Observer观察者模式及再思考
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 设计模式随笔系列:气象站的故事-观察者模式(Observer)[原]
- 利用观察者模式设计仿真器内核接口
- .NET中的设计模式五:观察者模式
- 设计模式之Observer观察者模式
- 认识观察者模式(设计模式)[转载]
- 设计模式学习笔记(二十一)——Observer观察者
- 用 spring 实现观察者设计模式
- .NET中的设计模式五:观察者模式 选择自 lane_cn 的 Blog
- 设计模式之观察者模式 (原创)
- 设计模式之观察者模式(Observer Pattern)(一)
- 设计模式之观察者模式
- IssueVision 学习笔记(三)-----设计模式之OBSERVER(观察者)模式
- 设计模式之观察者模式(Observer Pattern)(二)
- 探究观察者设计模式
- GEF框架中的设计模型(观察者模式)
- C#设计模式-观察者observer模式实现
- AspectJ实现设计模式(一)——观察者模式