//java实现观察者模式编程
import java.util.HashSet;
public class ObserverPattern {
public static void main(String[] args) {
// TODO Auto-generated method stub
Product p = new Product("java<java核心技术>", 103.00); //创建一个商品
Observer o1 = new WebObserver(); //第一个观察者
Observer o2 = new MailObserver(); //第二个观察者
p.addObserver(o1); //注册观察者1
p.addObserver(o2); //注册观察者1
System.out.println("===第一次价格改动===");
p.setPrice(80); //修改商品价格
o1.unreg(p); //观察者1取消观察
System.out.println("===第二次价格改动===");
p.setPrice(100); //再次修改商品价格
}
}
interface Observer{ //观察者接口
public void update(Product p); //价格修改的接口方法
public void unreg(Product p); //撤销注册
}
class WebObserver implements Observer{ //Web观察者
public void update(Product p) { //定义回调方法
System.out.println("更新页面价格:"+p.getName()+":"+p.getPrice());
}
public void unreg(Product p) {
p.getObservers().remove(this); //去掉本观察者
}
}
class MailObserver implements Observer{ //E-mail观察者
public void update(Product p) { //定义回调方法
System.out.println("为所有会员发送价格变化信息"+p.getName()+":"+p.getPrice());
}
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) {
// TODO Auto-generated constructor stub
this.name = name;
this.price = price;
observers = new HashSet<Observer>();
}
public void addObserver(Observer ob) { //添加观察者
observers.add(ob);
}
//通知监听者执行update()方法
public void notifyObserver() {
for (Observer ob : observers) {
ob.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;
}
}点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号