• 【设计模式】观察者模式


    观察者模式


    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("小米手机");
            /*输出结果
              苹果手机到货了,现特来告知亲--苹果粉丝
              苹果手机到货了,现特来告知亲--小米粉丝
              小米手机到货了,现特来告知亲--小米粉丝
            */
        }
    }
  • 相关阅读:
    第八篇:Vue组件传参
    第七篇:Vue的路由逻辑跳转
    第六篇:组件数据局部化处理
    第五篇:Vue项目的初始化
    第四篇:Vue的项目开发
    第三篇:Vue指令
    第二篇:Vue实例成员
    第一篇:Vue基础
    第六篇:js对象,类和函数补充
    AngularJS之jeDate日期控件基本使用
  • 原文地址:https://www.cnblogs.com/yadiel-cc/p/11831424.html
Copyright © 2020-2023  润新知