观察者模式的初始学习--自己实现

观察者模式:首先要理解观察者模式的定义,对象间一对多的关系,当其中的一个Object变化[subject]时,其他的依赖这个对象的对象[Observer],都会受到相应的通知,并且自动更新自己状态.

其中目标对象,是源头:subject,它应该包含有 add()    remove()    notify()  基本的单个方法,分别用于 注册观察者, 删除观察者,以及通知观察者.

而观察者对象: Observer 则应该有 update()方法,在收到依赖对象的变化通知时候,就自动执行update的方法,更新自己的状态信息.

代码实现观察者模式 --->基本的步骤如下:

1,(subject)目标对象(接口)的建立,其中规定统一的方法规则.

2,具体目标类的建立,都必须要实现subject的接口.

3,观察者接口的定义,Observer的接口,包含有update方法.

4,具体的观察者的建立,实现观察者接口.

具体的代码如下:

subject的接口的建立:

public interface Subject {

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉注册成为观察者
     *
     * @param observer
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    void registerObserver(Observer observer);
    
    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉取消成为观察者
     *
     * @param observer
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    void removeObserver(Observer observer);
    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉通知所有的观察者
     *
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    void notifyObservers();

}

具体的目标类的建立: 里面是包含了自己写的方便测试的代码.

public class GoodsData implements Subject {

    private ArrayList<Observer> observers;

    private String name;

    private int num;

    private int price;

    public GoodsData() {
        observers = new ArrayList<Observer>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        int i = observers.indexOf(observer);
        if (i >= 0) {
            observers.remove(i);
        }

    }

    @Override
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update(name, num, price);
        }
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉商品参数变化时 通知给个观察者变化
     *
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public void goodsChanged() {
        notifyObservers();
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉实时获取商品的参数信息,测试方法
     *
     * @param name
     * @param num
     * @param price
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public void setGoodsData(String name, int num, int price) {
        this.name = name;
        this.num = num;
        this.price = price;
        goodsChanged();
    }
}

观察者的接口的定义: 主要定义统一的update方法

public interface Observer {

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉观察者跟新主题最新的数据
     *
     * @param name 名称
     * @param num  数量
     * @param price 价格
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    void update(String name, int num, int price);

}

定义具体的观察者的类定义: 当然,里面也包含了一些方便测试的附加操作代码.

public class SuguoMarket implements Observer, DisplayElement {

    private String name;

    private int num;

    private int price;

    private Subject goodsMarket;

    public SuguoMarket(Subject goodsMarket) {
        this.goodsMarket = goodsMarket;
        goodsMarket.registerObserver(this);
    }

    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉取消注
     *
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public void removeObserver() {
        goodsMarket.removeObserver(this);
    }

    @Override
    public void display() {
        System.out.println("名称:" + name + "数量:" + num + "价格:" + price);
    }

    @Override
    public void update(String name, int num, int price) {
        this.name = "苏果" + name;
        this.num = num;
        this.price = price;
        display();
    }

}

最后简单的写个测试类的代码,方便运行查询实时效果:

public class MarkertTest {

    public static void main(String[] args) {

        GoodsData goods = new GoodsData();
        SuguoMarket suguo = new SuguoMarket(goods);
        goods.setGoodsData("香烟", 20, 100);
        goods.setGoodsData("啤酒", 100, 5);
        goods.setGoodsData("可樂", 100, 2);

        // 取消注册
        suguo.removeObserver();
        goods.setGoodsData("口香糖", 100, 2);
    }

}

到此为止,一个简单的观察者模式就建立完成了,后面会继续采用java的jdk自有的api来实现观察者模式

原文地址:https://www.cnblogs.com/lilin0719/p/5218178.html