您的位置:首页 > 其它

观察者模式的初始学习--自己实现

2016-02-25 20:01 405 查看
观察者模式:首先要理解观察者模式的定义,对象间一对多的关系,当其中的一个Object变化[subject]时,其他的依赖这个对象的对象[Observer],都会受到相应的通知,并且自动更新自己状态.

其中目标对象,是源头:subject,它应该包含有 add() \ remove() \ notify() 基本的单个方法,分别用于 注册观察者, 删除观察者,以及通知观察者.

而观察者对象: Observer 则应该有 update()方法,在收到依赖对象的变化通知时候,就自动执行update的方法,更新自己的状态信息.

代码实现观察者模式 --->基本的步骤如下:

1,(subject)目标对象(接口)的建立,其中规定统一的方法规则.

2,具体目标类的建立,都必须要实现subject的接口.

3,观察者接口的定义,Observer的接口,包含有update方法.

4,具体的观察者的建立,实现观察者接口.

具体的代码如下:

subject的接口的建立:

public interface Subject {

/**
*
* 功能描述: <br>
* 〈功能详细描述〉注册成为观察者
*
* @param observer
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
void registerObserver(Observer observer);

/**
*
* 功能描述: <br>
* 〈功能详细描述〉取消成为观察者
*
* @param observer
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
void removeObserver(Observer observer);
/**
*
* 功能描述: <br>
* 〈功能详细描述〉通知所有的观察者
*
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
void notifyObservers();

}


具体的目标类的建立: 里面是包含了自己写的方便测试的代码.

public class GoodsData implements Subject {

private ArrayList<Observer> observers;

private String name;

private int num;

private int price;

public GoodsData() {
observers = new ArrayList<Observer>();
}

@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);
}
}

/**
*
* 功能描述: <br>
* 〈功能详细描述〉商品参数变化时 通知给个观察者变化
*
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public void goodsChanged() {
notifyObservers();
}

/**
*
* 功能描述: <br>
* 〈功能详细描述〉实时获取商品的参数信息,测试方法
*
* @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 {

/**
*
* 功能描述: <br>
* 〈功能详细描述〉观察者跟新主题最新的数据
*
* @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);
}

/**
*
* 功能描述: <br>
* 〈功能详细描述〉取消注
*
* @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来实现观察者模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: