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


    观察者模式:首先要理解观察者模式的定义,对象间一对多的关系,当其中的一个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来实现观察者模式

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/lilin0719/p/5218178.html
Copyright © 2020-2023  润新知