观察者模式

被观察者为商品,观察者为具体的业务实现,如发邮件,修改页面价格;当商品价格变化后,通知所有被观察者进行业务更新

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"); } }

  

 

posted @ 2019-11-12 11:21  Andrew_F  阅读(101)  评论(0编辑  收藏  举报