zoukankan      html  css  js  c++  java
  • 设计模式之--观察者模式

    被观察者:

    /**
     * 购物车(被观察的对象,购物车添加了商品及时通知处理)
     * Created by youaijj on 2018/5/12.
     */
    public class ShoppingCart extends Observable {
        private List<Product> productList = new ArrayList<Product>();;
    
        public ShoppingCart(){}
    
        public void addSomething(Product product) {
            productList.add(product);
            // 关键点
            // 设置被观察对象发生变化
            this.setChanged();
            // 通知观察者
            this.notifyObservers(product);
        }
    }
    

     

    观察者:

    public class MsgObserver implements Observer {
        @Override
        public void update(Observable o, Object product) {
            Product newProduct = (Product) product;
            System.out.println("发送短信 --> 您的购物车中添加了商品: "+newProduct.getName());
        }
    }
    public class EmailObserver implements Observer {
        @Override
        public void update(Observable o, Object product) {
            Product newProduct = (Product) product;
            System.out.println("发送邮件 --> 您的购物车中添加了商品: "+newProduct.getName());
        }
    }
    

     

    参数:(通过参数可以将变化的细节传入观察者) 

    /**
     * 商品属性
     * Created by youaijj on 2018/5/12.
     */
    public class Product{
        private String name;
        private float price;
        private float weight;
        private String description;
    
       // getter, setter(略)
    }
    

     

    测试:

    public class MainTest {
        public static void main(String[] args) {
            ShoppingCart shoppingCart = new ShoppingCart();
            EmailObserver emailObserver = new EmailObserver();
            MsgObserver msgObserver = new MsgObserver();
    
            shoppingCart.addObserver(emailObserver);
            shoppingCart.addObserver(msgObserver);
    
            Product p = new Product();
            p.setName("女童夏日格子裙");
            p.setPrice(349.0f);
            shoppingCart.addSomething(p);
        }
    }
    

     结果:

     

    上面例子中出现的一些名词与对应的角色(动作):

    被观察者:ShoppingCart

    观察者1: EmailObserver

    观察者2: MsgObserver

    业务逻辑:ShoppingCart.addSomething(Product)

    观察者参数:Product

    添加观察者:ShoppingCart.addObserver(Observer)

    观察者的逻辑: Observer接口的唯一方法update(Observable o, Object arg);

    上面例子中,被观察者ShoppingCart有一个属性为elementData数组,为通过“添加观察者”动作将观察者添加到elementData数组中, 业务逻辑中通过操作被观察者的setChanged()和notifyObservers(...)方法来触发执行“观察者的逻辑”,而且每次触发都是遍历执行观察者列表中的所有“观察者的逻辑”

    注:java源码中,每次触发遍历前会将elementData拷贝一份,注意文中遍历的列表指的是拷贝后的。

     观察者模式逻辑大致如下图所示:

    过程简单解释:

    1. 被观察者主动添加观察者

    2. 观察者被添加到观察者列表中

    3. 事件触发,遍历执行观察者列表中各个观察的逻辑  

     下一篇:观察者模式之--事件监听模式 会介绍一下它与监听者模式的区别。

  • 相关阅读:
    JSP学习
    Maven
    Android开发环境搭建
    Java Spring MVC
    you don't know js -- Scope and Closures学习笔记——第五章(闭包) 下篇
    you don't know js -- Scope and Closures学习笔记——第五章(闭包) 上篇
    you don't know js -- Scope and Closures学习笔记——第四章(声明提升 Hoisting)
    you don't know js -- Scope and Closures学习笔记——第三章(函数VS块作用域)
    you don't know js -- Scope and Closures学习笔记——第二章(词法作用域)
    you don't know js -- Scope and Closures学习笔记——第一章(什么是作用域)
  • 原文地址:https://www.cnblogs.com/chenjunjie12321/p/9029429.html
Copyright © 2011-2022 走看看