设计模式学习之Observer(观察者模式)

本文介绍了观察者模式的基本概念,展示了如何在Java中实现这一模式。通过一个具体的例子——网络商店的商品变化通知会员的过程,深入浅出地解释了观察者模式的工作原理。文中详细介绍了被观察者(商品)和观察者(会员)的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者和被观察者的分开,为模块划分提供了清晰的界限。

通过观察者的定义我们可以得到两点:观察者是具体执行操作的对象,有多个;被观察者即被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作。

这里我通过一个例子加深对观察者模式的理解。一个网络商店中,当商品在名称和价格等方面有变化时, 系统将自动通知会员。这时就可以借助观察者模式来实现。这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作。

Java的API为为我们提供了现成的Observer接口Java.util.Observer。我们只要直接使用它就可以。

商品(Product)类即为被观察者,继承Observable来实现

import java.util.Observable;

public class Product extends Observable {
private String name;
private float price;

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

public String getName() {
return name;
}

public float getPrice() {
return price;
}

public void setName(String name) {
this.name = name;
setChanged();
notifyObservers(name);
}

public void setPrice(float price) {
this.price = price;
setChanged();
notifyObservers(new Float(price));
}

}



商品名称检测(ObserName)类, 实现Observer接口

import java.util.Observable;
import java.util.Observer;

public class ObserName implements Observer {
private String name;

public void update(Observable arg0, Object arg1) {
if(arg1 instanceof String) {
name = (String) arg1;
System.out.println("name has changed to " + name);
}
}

}



商品价格检测(ObserPrice)类, 实现Observer接口

import java.util.Observable;
import java.util.Observer;

public class ObserPrice implements Observer {
private float price;

public void update(Observable o, Object arg) {
if(arg instanceof Float) {
price = ((Float) arg).floatValue();
System.out.println("price has changed to " + price);
}
}

}



测试(Test)类

public class Test {
public static void main(String[] args) {
Product p = new Product("bag", 20.8f);
p.addObserver(new ObserName());
p.addObserver(new ObserPrice());

System.out.println(p.getName() + "\t" + p.getPrice());
p.setName("shoot");
p.setPrice(100.00f);
}
}


结果为:
bag 20.8
name has changed to shoot
price has changed to 100.0

当我设置新商品的名称,或设置商品的价格,即对商品作相应的变动时,观察者将获得被观察者商品自动发来的通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值