首页 > 其他分享 >一句话设计模式4:观察者模式

一句话设计模式4:观察者模式

时间:2023-06-12 16:38:46浏览次数:33  
标签:appleList People orangeList people 观察者 模式 add new 设计模式


观察者模式:牵一发而动全身。



文章目录

  • 观察者模式:牵一发而动全身。
  • 前言
  • 一、观察者的作用
  • 二、如何实现观察者
  • 总结



前言

观察者模式一般使用场景是: 多个对象之间存在联系,当其中一个改变的时候,其他的所有关系对象都要做出相应改变;


一、观察者的作用

1 可以快速通知其他对象做出改变
2 减少了对象之间的耦合性,对象之间不直接通信,通过观察者来驱动相应改变

二、如何实现观察者

例如现在有三个人,买了若干东西,在超市中结账;已经结账完毕;此时通知某一个商品降价了,要求重新计算每个人购买的商品总价;
既: 某个商品价格的改动,涉及到了所有购买这个商品的人的总价计算;

人 买了若干个苹果,橘子

@Data
@AllArgsConstructor
@NoArgsConstructor
public class People{

    private List<Apple> appleList;

    private List<Orange> orangeList;

    public Integer getMemony() {
        return Optional.ofNullable(appleList).orElse(new ArrayList<>()).stream().mapToInt(Apple::getPrice).sum()
                + Optional.ofNullable(orangeList).orElse(new ArrayList<>()).stream().mapToInt(Orange::getPrice).sum();
    }

    public void setOrangePrice(Integer price) {
        Optional.ofNullable(orangeList).orElse(new ArrayList<>())
                .stream().forEach(orange -> orange.setPrice(orange.getPrice() + price));
    }
}

苹果/ 橘子

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Orange {

    private String name;

    private Integer price;

}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Apple {

    private String name;

    private Integer price;
}

观察者

@Data
@AllArgsConstructor
@NoArgsConstructor
public  class Guanchazhe {
    private List<People> peopleList;

    public void setOrangePrice(Integer price) {
        for (People people : peopleList) {
            people.setOrangePrice(price);
        }
    }
}

开始测试

public class Test {
    public static void main(String[] args) {

        People people = getPeople();
        People people1 = getPeople1();
        People people2 = getPeople2();
        System.out.println(people + "==========" + people.getMemony());
        System.out.println(people1 + "===========" + people1.getMemony());
        System.out.println(people2 + "===========" + people2.getMemony());

        // 橘子打折,价格降低5元;
        // 所有人应该付款的价格都需要重新计算
        List<People> peopleList = CollectionUtil.newArrayList();
        peopleList.add(people1);
        peopleList.add(people2);
        peopleList.add(people);

        Guanchazhe guanchazhe = new Guanchazhe();
        guanchazhe.setPeopleList(peopleList);

        guanchazhe.setOrangePrice(-5);

        System.out.println(people + "==========" + people.getMemony());
        System.out.println(people1 + "===========" + people1.getMemony());
        System.out.println(people2 + "===========" + people2.getMemony());

    }

    private static People getPeople() {
        People people = new People();
        List<Apple> appleList = CollectionUtil.newArrayList();
        appleList.add(new Apple("大苹果", 12));
        appleList.add(new Apple("小苹果", 11));
        people.setAppleList(appleList);

        List<Orange> orangeList = CollectionUtil.newArrayList();
        orangeList.add(new Orange("大橘子", 15));
        orangeList.add(new Orange("小橘子", 13));
        people.setOrangeList(orangeList);
        return people;
    }

    private static People getPeople2() {
        People people = new People();

        List<Orange> orangeList = CollectionUtil.newArrayList();
        orangeList.add(new Orange("大橘子", 15));
        people.setOrangeList(orangeList);

        return people;
    }

    private static People getPeople1() {
        People people = new People();
        List<Apple> appleList = CollectionUtil.newArrayList();
        appleList.add(new Apple("大苹果", 12));
        appleList.add(new Apple("小苹果", 11));
        people.setAppleList(appleList);
        return people;
    }
}

一句话设计模式4:观察者模式_java

1 可以看到,降价之前每个人的总费用已经计算完毕
2 降价之后,通过观察者的 setOrangePrice 降价方法,通知了所有人,重新计算各自价格
3 最终每个人的总价重新计算,得到了降价之后的总价


总结

观察者,相当于简化了多个有关系的对象之间通信(一对多为主),其实写起来很简单,大家看起来也很简单,但这也称之为一种设计模式; 感觉就是: 可能我们平时稍微优化的代码,可能就是已经使用了一种设计模式,只是我们自己不知道而已…


标签:appleList,People,orangeList,people,观察者,模式,add,new,设计模式
From: https://blog.51cto.com/u_16158506/6463426

相关文章

  • 一句话设计模式6:享元模式
    享元模式:局部单例模式。文章目录享元模式:局部单例模式。前言一、享元模式的作用二、如何实现享元模式总结前言享元模式其实很简单,但是如果用好,确实可以达到减少内存,事半功倍的效果;适合系统要创建大量相似对象,相同对象等;一、享元模式的作用1享元模式可以解决对象的重复......
  • 一句话设计模式5:责任链模式
    责任链模式:步步为营。文章目录责任链模式:步步为营。前言一、责任链模式的作用二、如何实现责任链1既然是责任链,那么就需要一个链路的承载体ChainBody2责任链中每一步都是一个抽象类,因为承载体仅仅是构造链路顺序,里面不放置任何具体业务逻辑:步骤抽象类3具体步骤执行,继承......
  • 关于浏览器的PWA模式
    浏览器的PWA模式是一种可安装(Installable),可以出现在设备的主屏幕。关于开发如何识别PWA模式constisInStandaloneMode=()=>(window.matchMedia('(display-mode:standalone)').matches)......
  • Redis集群-哨兵模式搭建(1主2从3哨兵节点)
    Redis集群-哨兵模式搭建(1主2从3哨兵节点)原创 北极星 运维记事 2023-04-2022:47 发表于四川收录于合集#redis8个主机规划类型IP地址端口号主192.168.77.1456379从1192.168.77.1466379从2192.168.77.1476379哨兵1192.168.77.14526379哨兵2......
  • MySql5.7主从同步配置(gtid模式)
    mysql数据库主从同步配置是开发中比较常见的需求,在MySql里,主从同步主要有两种,bin-log和gtid。下面就主要总结一下使用gtid模式配置主从同步的过程。1.概念全局事务标识:globaltransactionidentifiers;GTID是一个事务一一对应,并且全局唯一ID;一个GTID在一个服务器上只执行一次,避免......
  • 设计模式之装饰者模式--钢铁侠的形成
    前言本文主要讲述java常见设计模式之装饰者模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。一.什么是装饰者模式装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩......
  • Android中Activity的启动模式
    Android中Activity的启动模式一共有4种,分别是standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来指定启动模式。1、standard在standard模式下,每当启动一个新的Activity,他就会在返回栈中入栈,并处于......
  • 05.工厂方法模式
    使用工厂方法模式来解决问题定义定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到其子类。应用工厂方法式来解决问题的思路工厂方法模式的解决思路很有意思,那就是不解决,采取无为而治的方式:不是需要接口对象吗,那就定义一个方法来创......
  • redis四种模式
    1、单机模式单机模式就是在一台服务器上安装redis,然后启动,所有业务都调用这一台redis服务器。优点:部署简单,只需要在一台服务器上安装并启动redis就行。成本低,没有备用节点,不需要其他的开支。高性能,单机不需要同步数据,数据天然一致性。缺点:可靠性较弱,一旦服务器宕机,所有业务......
  • 代理模式的简单理解
    1.废话​ 上次io流联系的时候,有一个地方有待优化,计划使用代理模式。恰逢开始写博客,着闲着也是闲着记录一下丰富一下我的博客记录,之前看过一些网上其他的代理的讲解都很高端,我这技术有限只说一下自己理解的代理模式2.背景​ 之前统计项目中废没在被使用的VUE文件时写了一个遍历......