观察者模式
被观察者为商品,观察者为具体的业务实现,如发邮件,修改页面价格;当商品价格变化后,通知所有被观察者进行业务更新
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"); } }