zoukankan      html  css  js  c++  java
  • 【设计模式】观察者模式

    观察者模式


    2019-11-10  18:11:40  by冲冲

    1、概念

    多个观察者(继承同一个抽象类)只需要注册到被观察者的通知名单,被观察者如果发生改变,则会主动通知观察者。

    观察者继承同一个抽象类,该抽象类定义一个反应方法,用来定义当被观察者发生改变时不同观察者的行为。同时该抽象类在构造时将被观察者注册为属性成员。

    被观察者有一个通知名单(属性成员),每个观察者要主动注册到该名单,当被观察者发生改变,会调用名单上面所有观察者对象的反应方法。

    观察者模式,亦称发布-订阅模式。

    2、完整代码

    import java.util.ArrayList;
    import java.util.List;
    
    class Shop {
        private String product;
        private List<Buyer> buyers;// 持有买家的引用,即通知名单
        public Shop() {
            this.product = "无商品";
            this.buyers = new ArrayList<>();
        }
        // 为了主动通知买家,买家得来店里注册。
        public void register(Buyer buyer) {
            this.buyers.add(buyer);
        }
        public String getProduct() {
            return product;
        }
        public void setProduct(String product) {
            this.product = product;// 到货了
            notifyBuyers();// 到货后通知买家
        }
        // 通知所有注册买家
        public void notifyBuyers() {
            buyers.stream().forEach(b -> b.inform());
        }
    }
    
    abstract class Buyer {
        protected String name;
        protected Shop shop;
        public Buyer(String name, Shop shop) {
            this.name = name;
            this.shop = shop;
        }
        public abstract void inform();
    }
    
    class IPhoneFans extends Buyer {
        public IPhoneFans(String name, Shop shop) {
            super(name, shop);//调用父类进行构造
        }
        @Override
        public void inform() {
            String product = shop.getProduct();
            if(product.contains("苹果手机")){//此买家只买苹果手机
                System.out.println(product + "到货了,现特来告知亲--" + name);
            }
        }
    }
    
    class AllPhoneFans extends Buyer {
        public AllPhoneFans(String name, Shop shop) {
            super(name, shop);
        }
        @Override
        public void inform() {
            String product = shop.getProduct();
            System.out.println(product + "到货了,现特来告知亲--" + name);
        }
    }
    
    public class Observer {
        public static void main(String[] args) {
            Shop shop = new Shop();
            Buyer tanSir = new IPhoneFans("苹果粉丝", shop);
            Buyer barJeet = new AllPhoneFans("小米粉丝", shop);
            shop.register(tanSir);
            shop.register(barJeet);
            //商店到货
            shop.setProduct("苹果手机");
            shop.setProduct("小米手机");
            /*输出结果
              苹果手机到货了,现特来告知亲--苹果粉丝
              苹果手机到货了,现特来告知亲--小米粉丝
              小米手机到货了,现特来告知亲--小米粉丝
            */
        }
    }
  • 相关阅读:
    【测试方法】之模拟cpu/mem/io使用率
    【数据库原理】之clickhouse学习笔记
    python每日一练
    栈的压入、弹出序列
    包含min函数的栈
    顺时针打印矩阵
    二叉树的镜像
    树的子结构*
    调整数组顺序使奇数位于偶数前面
    在O(1)时间内删除链表节点
  • 原文地址:https://www.cnblogs.com/yadiel-cc/p/11831424.html
Copyright © 2011-2022 走看看