Java设计模式菜鸟系列(二)观察者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577


观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动跟新。Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口。先看uml模型图:


一、UML模型图


二、代码实现

/** 示例:咱们去菜市场买菜
 * 
 * 小商贩--主题
 */
class Food extends Observable {
	/** 菜名 */
	private String name;
	/** 菜价 */
	private float price;

	public Food(String name, float price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
		/**
		 * 设置菜价的状态已经被改变
		 */
		this.setChanged();
		/**
		 * 通知【所有】正在看菜(已经注册了)的顾客,然后回调Observer的update方法进行更新
		 * 
		 * 这里可以体现对象的一对多:一个小商贩一旦更新价格(即一个对象改变状态),便会自动通知所有的顾客(依赖它的对象都会收到通知)
		 * 并自动update
		 */
		this.notifyObservers(price);
	}

}

/**
 * 顾客 --观察者
 */
class Customer implements Observer {
	private String name;

	public Customer(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	@Override
	public void update(Observable o, Object arg) {
		if (o instanceof Food && arg instanceof Float) {
			Food food = (Food) o;
			float price = (Float) arg;
			System.out.println("您好:" + this.name + " ," + food.getName()
					+ "的价格已经发生改变,现在的价格为:" + price + "元/斤");
		}
	}

}

/**
 * 客户端测试类
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Food food = new Food("土豆", 1.0f);
		Customer zhangsan = new Customer("张三");
		Customer lisi = new Customer("李四");
		/**
		 * 添加顾客
		 */
		food.addObserver(zhangsan);
		food.addObserver(lisi);
		/**
		 * 更新价格
		 */
		food.setPrice(1.5f);
	}
}

三、应用场景

GUI框架、气象观察等


四、小结

在通知所有观察者之前一定要调用 setChanged()方法来设置被观察者的状态已经被改变,这样notifyObservers()才会回调Observer的update方法进行更新。

以上内容如果有不同的见解或疏忽的地方,还请大家提出宝贵的建议或意见。

最后大家可以试着将下面的uml模型进行具体的代码实现,如图:附源码



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值