zoukankan      html  css  js  c++  java
  • 观察者模式的初始学习--自己实现

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

  • 相关阅读:
    点餐系统的设计与实现注意点与解决办法
    不借助临时变量交换两个数值
    python2.7之乱码问题
    netty-学习笔记
    每天一个linux命令---curl
    每天一个linux命令---useradd
    webservice 学习笔记
    每天一个linux命令---kill
    XML解析
    每天一个linux命令---tar
  • 原文地址:https://www.cnblogs.com/lilin0719/p/5218178.html
Copyright © 2011-2022 走看看