观察者模式
被观察者为商品,观察者为具体的业务实现,如发邮件,修改页面价格;当商品价格变化后,通知所有被观察者进行业务更新
package observer;
import java.util.HashSet;
/**
* @description 被观察者
**/
public class Product {
private String price;
private String name;
private HashSet<Observer> observers =new HashSet<>(); //存放所有观察者
public Product(String price, String name, HashSet<Observer> observers) {
this.price = price;
this.name = name;
this.observers = observers;
}
public String getPrice() {
return price;
}
//价格变化的时候通知观察者
public void setPrice(String price) {
this.price = price;
notifyOberver();
}
//通知所有观察者进行业务处理
private void notifyOberver(){
for (Observer o:observers){
o.update(this);
}
}
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;
}
}
//观察者接口
public interface Observer {
//被观察者价格变化后,通知观察者更新业务(发邮件,更新页面价格)
void update(Product product);
//被观察者取消观察
void unreg(Product product);
}
/**
* @description 发邮件
**/
public class MailObserver implements Observer {
@Override
public void update(Product product) {
System.out.println("发邮件,价格变化为:"+ product.getPrice());
}
@Override
public void unreg(Product product) {
product.getObservers().remove(this);
}
}
/**
* @description 修改页面价格
**/
public class PriceObserver implements Observer {
@Override
public void update(Product product) {
System.out.println("修改页面价格,价格变化为:"+ product.getPrice());
}
@Override
public void unreg(Product product) {
product.getObservers().remove(this);
}
}
import java.util.HashSet;
public class ObserverTest {
public static void main(String args[]){
Product p = new Product("10","java",new HashSet<>());
MailObserver o1 = new MailObserver();
PriceObserver o2 = new PriceObserver();
p.getObservers().add(o1);
p.getObservers().add(o2);
System.out.println("第1次变更价格");
p.setPrice("20");
o1.unreg(p);
System.out.println("第2次变更价格");
p.setPrice("30");
}
}

浙公网安备 33010602011771号