观察者模式(Observer)

一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。就可以使用观察者模式,当少的一方状态发生改变时会自动通知所有依赖它的对象并自动更新。

Java已经提供了观察者模式的默认支持,Observable类 和 Observer接口。

目标对象需要继承Observable类,目标对象代码如下:

public class Food extends Observable {
    
    // 菜名
    private String name;
    // 价格
    private float price;
    
    public Food(String name, float price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
        
        // 价格发生改变
        this.setChanged();
        // 商贩一旦改变菜价,便会通知所有顾客(回调Observer的update方法进行更新)
        this.notifyObservers(price);
    }
}

观察者,需要实现Observer接口,并且重写update方法,update方法写根据实际情况写业务逻辑。

/**
 * 顾客
 *
 */
public class Customer implements Observer{
    
    private String name;
    
    public Customer(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
    
    // 目标对象状态一旦发生改变,便会执行此方法
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof Food && arg instanceof Float) {
            Food food = (Food) o;
            float price = (Float) arg;
            System.out.printf("您好: %s, %s的价格已经发生改变,现在的价格为:%.2f 元/斤\n", this.name, food.getName(), price);
        }
    }
}

测试,观察者想要接到通知,还需要在目标对象调用 addObserver(Object obj) 方法注册

public class TestMain {
    
    @Test
    public void test() {
        // 商品
        Food food = new Food("土豆", 11.5f);
        // 顾客
        Customer lisi = new Customer("李四");
        Customer wangwu = new Customer("王五");
        
        // 添加需要通知顾客
        food.addObserver(lisi);
        food.addObserver(wangwu);
        
        // 更新价格
        food.setPrice(100.0f);
    }
}

你可能感兴趣的:(观察者模式(Observer))