首页 > 其他分享 >趣解装饰者模式之《我想吃煎饼果子了》

趣解装饰者模式之《我想吃煎饼果子了》

时间:2023-11-10 16:04:59浏览次数:27  
标签:趣解 煎饼果子 public Food cost 煎饼 food 装饰

〇、小故事

话说最近早起没时间做早饭,并且早上上班的地铁口不远处就有一处非常火爆的煎饼摊,所以我就经常去那边吃煎饼,一个“基础版”煎饼是7块钱,向煎饼中加一颗鸡蛋是1元钱加一根火腿肠是3元钱加鸡柳是4元钱……

好像基本上能想到的美食都能往煎饼里塞似的。这就让我想起之前看过的一个短视频,一个小伙子去买煎饼,说要加50颗鸡蛋,然后摊出来的煎饼果子跟一个大披萨似的,非常有趣。

趣解装饰者模式之《我想吃煎饼果子了》_System

那么,做煎饼果子似乎没什么难度,但是,怎么计算总价呢? 我们可以往里放各种“辅料”,那计算出来的总价也会千差万别,如果说我们针对不同的煎饼搭配组合都实现cost()价格方法,这样可以吗?如果这种种类少,其实是可以的,但是,如果组合非常多,那必然就造成了“类爆炸了”,那么这种设计方式就不合适了。

趣解装饰者模式之《我想吃煎饼果子了》_System_02

那我们还有什么解决办法吗?我们可以采用装饰者模式,来解决这个问题。下面,我们就将视野转到装饰者模式吧。

一、模式定义

装饰者模式定义:

动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

模拟顾客购买煎饼果子+1颗鸡蛋+1跟香肠的过程:

趣解装饰者模式之《我想吃煎饼果子了》_设计模式_03

二、模式类图

为了可以进一步说明装饰者模式在购买煎饼问题上的处理方法,我们以类图的方式展示煎饼与辅料之间的关系。需要说明的一点是,为了表示煎饼的实习类可以是一个“种族”,所以列举出了“白面煎饼”、"黑面煎饼"和“杂粮煎饼”,这些都属于上面我们所描述的基础类煎饼

趣解装饰者模式之《我想吃煎饼果子了》_Java_04

三、代码实现

创建食物抽象类Food,所有食物都需要继承该抽象类:

public abstract class Food {
    String description = "食物";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

创建辅料抽象类AccessoriesDecorator,后续添加到煎饼果子里的辅料都需要继承该类:

public abstract class AccessoriesDecorator extends Food {
    public abstract String getDescription();
}

创建基础版煎饼果子类JianBing,需要继承Food抽象类:

public class JianBing extends Food {

    public JianBing() {
        description = "基础版煎饼果子";
    }

    public double cost() {
        System.out.println("基础版煎饼果子售价:" + 7 + "元");
        return 7;
    }
}

创建鸡蛋类Egg,由于它属于辅料,所以继承AccessoriesDecorator抽象类:

public class Egg extends AccessoriesDecorator {

    private Food food;

    public Egg(Food food) {
        this.food = food;
    }

    public String getDescription() {
        return "鸡蛋";
    }

    public double cost() {
        System.out.println("添加鸡蛋售价:" + 1 + "元");
        return 1 + food.cost();
    }
}

创建鸡蛋类Sausage,由于它属于辅料,所以继承AccessoriesDecorator抽象类:

public class Sausage extends AccessoriesDecorator {
    private Food food;

    public Sausage(Food food) {
        this.food = food;
    }

    public String getDescription() {
        return "香肠";
    }

    public double cost() {
        System.out.println("添加香肠售价:" + 3 + "元");
        return 3 + food.cost();
    }
}

创建测试类DecoratorTest,计算购买1个基础版煎饼果子加入1颗鸡蛋加入1根香肠的总消费金额:

public class DecoratorTest {
    public static void main(String[] args) {
        // 创建煎饼果子
        Food jianBing = new JianBing();
        
        // 创建鸡蛋,加入到煎饼果子中
        Food egg = new Egg(jianBing);
        
        // 创建香肠,加入到煎饼果子中
        Food sausage = new Sausage(egg);
        
        System.out.println("总金额为:" + sausage.cost() + "元");
    }
}

输出结果:

添加香肠售价:3元
添加鸡蛋售价:1元
基础版煎饼果子售价:7元
总金额为:11.0元

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ (^o^)/ ~ 「干货分享,每天更新」

标签:趣解,煎饼果子,public,Food,cost,煎饼,food,装饰
From: https://blog.51cto.com/muse/8303723

相关文章

  • 趣解适配器模式之《买了苹果笔记本的尴尬》
    〇、小故事小王考上了理想的大学,为了更好的迎接大学生活,他决定买一台苹果的笔记本电脑犒赏自己。电脑很快买好了,用起来也非常的流畅,但是,当他想要插U盘传资料的时候,尴尬的事情来了,这台电脑两侧的插口非常少,只有1个耳机插孔和2个雷电插孔,根本没有USB插口!这咋办呀?他赶快咨询了他的哥哥......
  • 趣解建造者模式之网红小王购车记
    一、前言本文章是关于设计模式中的建造者模式的,也称构建者模式/生成器模式,英文我们称之为BuilderPattern。在开展讲解之前,我们先把该模式的定义了解一下。建造者模式的定义:该模式可以实现产品的封装构造过程,并允许按步骤构造产品。该模式的优点:可以将一个复杂对象的创建过程封装起......
  • 结构型模式-装饰模式
    1什么是装饰模式装饰模式(DecoratorPattern)是一种结构型设计模式,它允许将新功能动态地添加到对象中,通过将对象放入特殊的包装对象中,这样可以在不改变其接口的情况下,对对象的功能进行逐步扩展。在装饰模式中,通常包括以下几个角色:抽象构件(Component)、具体构件(ConcreteComponent)......
  • 《流畅的Python》 读书笔记 第7章_函数装饰器和闭包
    第7章函数装饰器和闭包装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包如果你想自己实现函数装饰器,那就必须了解闭包的方方面面,因此也就需......
  • 装饰模式实现
    用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。类图:  源码:1. 提交源代码;packagesimplePhone;/** *抽象手机构件类:抽象构件类 ......
  • 大话设计模式之装饰模式笔记
    装饰模式的基本结构classDiagramclassComponent{<<interface>>+operation();}classConcreateComponent{+operation();}classDecrator{-Componentcomponent;+operation();}class......
  • OpenHarmony 状态变量更改通知:@Watch 装饰器
    @Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。说明:从APIversion9开始,该装饰器支持在ArkTS卡片中使用。概述@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch......
  • 软件设计-装饰器模式
    publicclass装饰器模式{publicstaticvoidmain(String[]args){//第一种写法Personperson=newStudent("张三");person.Operation();System.out.println();person=newDecoratorA(person);person.Oper......
  • 设计模式-装饰器模式
    目录设计模式-装饰器模式什么是装饰器设计模式?java示例设计模式-装饰器模式什么是装饰器设计模式?装饰器设计模式(DecoratorPattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展其功能。装饰器模式能够在不改变原有对象的情况下,通过添加新的装饰器类......
  • 装饰器模板
    双层装饰器defoutter(func):defwrapper(*args,**kwargs): #wrapper是未来要运行的函数#此处加功能res=func(*args,**kwargs) #func是被装饰的函数returnresreturnwrapper三层装饰器:给双层装饰器加参数的defsanceng():......