观察者模式:首先要理解观察者模式的定义,对象间一对多的关系,当其中的一个Object变化[subject]时,其他的依赖这个对象的对象[Observer],都会受到相应的通知,并且自动更新自己状态.
其中目标对象,是源头:subject,它应该包含有 add() \ remove() \ notify() 基本的单个方法,分别用于 注册观察者, 删除观察者,以及通知观察者.
而观察者对象: Observer 则应该有 update()方法,在收到依赖对象的变化通知时候,就自动执行update的方法,更新自己的状态信息.
代码实现观察者模式 --->基本的步骤如下:
1,(subject)目标对象(接口)的建立,其中规定统一的方法规则.
2,具体目标类的建立,都必须要实现subject的接口.
3,观察者接口的定义,Observer的接口,包含有update方法.
4,具体的观察者的建立,实现观察者接口.
具体的代码如下:
subject的接口的建立:
public interface Subject { /** * * 功能描述: * 〈功能详细描述〉注册成为观察者 * * @param observer * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void registerObserver(Observer observer); /** * * 功能描述: * 〈功能详细描述〉取消成为观察者 * * @param observer * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void removeObserver(Observer observer); /** * * 功能描述: * 〈功能详细描述〉通知所有的观察者 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void notifyObservers();}
具体的目标类的建立: 里面是包含了自己写的方便测试的代码.
public class GoodsData implements Subject { private ArrayListobservers; private String name; private int num; private int price; public GoodsData() { observers = new ArrayList (); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int i = observers.indexOf(observer); if (i >= 0) { observers.remove(i); } } @Override public void notifyObservers() { for (Observer o : observers) { o.update(name, num, price); } } /** * * 功能描述: * 〈功能详细描述〉商品参数变化时 通知给个观察者变化 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void goodsChanged() { notifyObservers(); } /** * * 功能描述: * 〈功能详细描述〉实时获取商品的参数信息,测试方法 * * @param name * @param num * @param price * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void setGoodsData(String name, int num, int price) { this.name = name; this.num = num; this.price = price; goodsChanged(); }}
观察者的接口的定义: 主要定义统一的update方法
public interface Observer { /** * * 功能描述: * 〈功能详细描述〉观察者跟新主题最新的数据 * * @param name 名称 * @param num 数量 * @param price 价格 * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void update(String name, int num, int price);}
定义具体的观察者的类定义: 当然,里面也包含了一些方便测试的附加操作代码.
public class SuguoMarket implements Observer, DisplayElement { private String name; private int num; private int price; private Subject goodsMarket; public SuguoMarket(Subject goodsMarket) { this.goodsMarket = goodsMarket; goodsMarket.registerObserver(this); } /** * * 功能描述: * 〈功能详细描述〉取消注 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void removeObserver() { goodsMarket.removeObserver(this); } @Override public void display() { System.out.println("名称:" + name + "数量:" + num + "价格:" + price); } @Override public void update(String name, int num, int price) { this.name = "苏果" + name; this.num = num; this.price = price; display(); }}
最后简单的写个测试类的代码,方便运行查询实时效果:
public class MarkertTest { public static void main(String[] args) { GoodsData goods = new GoodsData(); SuguoMarket suguo = new SuguoMarket(goods); goods.setGoodsData("香烟", 20, 100); goods.setGoodsData("啤酒", 100, 5); goods.setGoodsData("可樂", 100, 2); // 取消注册 suguo.removeObserver(); goods.setGoodsData("口香糖", 100, 2); }}
到此为止,一个简单的观察者模式就建立完成了,后面会继续采用java的jdk自有的api来实现观察者模式