笨蛋学设计模式结构型模式-装饰者模式【9】

这篇具有很好参考价值的文章主要介绍了笨蛋学设计模式结构型模式-装饰者模式【9】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

7.3装饰者模式⬆️⬆️⬆️

7.3.1概念

​ 装饰者模式通过在一个现有对象中,能动态的给该对象添加新的功能,同时不改变对象本身的结构,是继承的一种替代方案,可以实现在不定义子类的情况下,运行时动态地扩展对象的行为(给对象添加一些额外的功能),而无需修改原有代码。

7.3.2场景

​ 当我们去一家咖啡店时,点了一杯咖啡。这时,你觉得咖啡有点苦,或者说咖啡的味道不够丰富,就可以给店员 / 咖啡师说,希望可以在我们的咖啡中添加糖、牛奶等不同的食材以此来丰富我们咖啡。这些食物都可以看作是装饰者,然后我们可以根据自己的具体口味,添加不同程度的以及不同风味的食材。

7.3.3优势 / 劣势

  • 可扩展性:根据多个不同的装饰类来组合出不同功能,以此来装饰同一对象
  • 灵活性:在不改变原有对象的基础上,动态的给对象添加新的功能
  • 易于维护:由于装饰者模式的动态性,可以随时添加或删除装饰者,无需修改原有的代码

  • 系统复杂度:因为装饰者模式需要创建更多的类和对象,会增加系统的复杂度
  • 执行效率降低:装饰者模式是动态添加 / 删除的,可能会引入一些性能问题,最后导致执行效率降低

7.3.4装饰者模式可分为

  • 组件Component:通常是抽象类或者接口,是具体组件和装饰者的父类,定义了具体组件需要实现的方法
  • 具体组件ConcreteComponent:实现类Component接口的具体类,是被装饰的对象
  • 装饰类:一个抽象类,给具体组件添加功能,但是具体的功能由其子类具体装饰者完成,持有一个指向Component对象的引用
  • 具体装饰类ConcreteDecorator:扩展Decorator类,负责向Component对象添加新的行为,加牛奶的咖啡是一个具体装饰类,加糖的咖啡也是一个具体装饰类

7.3.5装饰者模式

package com.technologystatck.designpattern.mode.decoration;

public class Decoration {
    public static void main(String[] args) {
        //创建具体组件
        ConcreteComponent concreteComponent = new ConcreteComponent();

        //使用具体装饰者装饰具体组件
        Decorator decorator = new ConcreteDecorator(concreteComponent);

        //调用方法
        decorator.operation();

    }
}


//1.定义Component组件接口
interface Component{
    void operation();
}

//2.实现ConcreteComponent具体组件
class ConcreteComponent implements Component{

    @Override
    public void operation() {
        System.out.println("ConcreteComponent operation");
    }
}

//3.定义抽象Decorator装饰类,继承自Component
abstract class Decorator implements Component{
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        component.operation();
    }
}

//4.定义具体的装饰者实现,给具体组件对象添加功能
class ConcreteDecorator extends Decorator{

    public ConcreteDecorator(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("Before operation in ConcreteDecorator");
        super.operation();
        System.out.println("After operation in ConcreteDecorator");

    }
}

7.3.6实战

7.3.6.1题目描述

小明喜欢品尝不同口味的咖啡,他发现每种咖啡都可以加入不同的调料,比如牛奶、糖和巧克力。他决定使用装饰者模式制作自己喜欢的咖啡。

请设计一个简单的咖啡制作系统,使用装饰者模式为咖啡添加不同的调料。系统支持两种咖啡类型:黑咖啡(Black Coffee)和拿铁(Latte)。

7.3.6.2输入描述

多行输入,每行包含两个数字。第一个数字表示咖啡的选择(1 表示黑咖啡,2 表示拿铁),第二个数字表示要添加的调料类型(1 表示牛奶,2 表示糖)。

7.3.6.3输出描述

根据每行输入,输出制作咖啡的过程,包括咖啡类型和添加的调料。

7.3.6.4代码
package com.technologystatck.designpattern.mode.decoration;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            //咖啡类型
            int coffeeType = scanner.nextInt();
            //咖啡装饰类型
            int condimentType = scanner.nextInt();

            //根据选择制作不同的咖啡
            Coffee coffee=null;
            if(coffeeType ==1){
                coffee=new BlackCoffee();
            }else if(coffeeType ==2){
                coffee=new Latte();
            }else{
                System.out.println("Invald coffee type");
                continue;
            }

            //添加不同的食材
            if(condimentType == 1){
                coffee=new MilkDecorator(coffee);
            }else if(condimentType ==2){
                coffee=new SugarDecorator(coffee);
            }else{
                System.out.println("Invald condiment type");
                continue;
            }
            //输出制作过程
            coffee.brew();
        }

    }
}

//抽象咖啡组件
interface Coffee{
    //制作咖啡的方法
    void brew();
}

//具体的黑咖啡类
class BlackCoffee implements Coffee{

    @Override
    public void brew() {
        System.out.println("Brewing Black Coffee");
    }
}

//具体的拿铁咖啡类
class Latte implements Coffee{

    @Override
    public void brew() {
        System.out.println("Brewing Latte Coffee");

    }
}

//装饰者抽象类
abstract class AbstractDecorator implements Coffee{
    protected Coffee coffee;

    public AbstractDecorator(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public void brew() {
        coffee.brew();
    }
}

//具体的牛奶装饰者类实现
class MilkDecorator extends AbstractDecorator{

    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public void brew() {

        super.brew();
        System.out.println("Adding Milk");
    }
}

class SugarDecorator extends AbstractDecorator{

    public SugarDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public void brew() {
        super.brew();
        System.out.println("Adding Sugar");
    }
}

7.3.7总结

  • 装饰者模式

  • 优点:是一种比继承更弹性的替代方案,不改变原有代码,动态添加新功能

  • 总结:若需要动态地扩展对象的功能,不会过度复杂化系统代码,可以选择装饰者模式

  • 场景文章来源地址https://www.toymoban.com/news/detail-798889.html

    • 由于某些原因不能使用继承来生成子类进行扩充时
    • 当对象的要求可以动态地添加,也可以动态地删除时

到了这里,关于笨蛋学设计模式结构型模式-装饰者模式【9】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 笨蛋学设计模式结构型模式-适配器模式【7】

    7.1.1概念 ​ 适配器模式是指将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类,能够在一起工作。基本上也就是通过增加一个中间层来解决,而适配器扮演的角色恰恰就是这个中间层。 7.1.2场景 ​ 在我们生活中可以看见的

    2024年01月18日
    浏览(37)
  • 设计模式【结构型】-- 装饰者模式

    装饰者模式是一种 结构型设计模式 ,它允许你动态地将新功能添加到对象中,通过将对象放入包含这些功能的特殊包装器对象中。这样一来,你可以在运行时通过组合不同的对象来扩展功能,而不是通过继承修改代码。 大白话 : 装饰模式,是指在不改变原有对象的基础上

    2024年02月16日
    浏览(57)
  • 【地铁上的设计模式】--结构型模式:装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象添加新的行为,同时又不改变原有对象的结构。装饰器模式中,包装器对象和被包装对象实现了相同的接口,因此客户端无需知道具体的实现细节,只需通过

    2024年02月02日
    浏览(39)
  • 【设计模式】第11节:结构型模式之“装饰器模式”

    装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设

    2024年02月06日
    浏览(46)
  • 【C++设计模式之装饰模式:结构型】分析及示例

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地给一个对象添加额外的行为。 描述 装饰模式通过创建一个包装器(Wrapper)来包裹原始对象,并在原始对象的行为前后添加额外的功能。通过这种方式,可以实现在不改变原始对象结构的情况下,动态

    2024年02月07日
    浏览(37)
  • 《golang设计模式》第二部分·结构型模式-04-装饰器模式(Decorator)

    装饰器(Decorator)通过包装(不是继承)的方式向目标对象中动态地添加或删除功能。 Component(抽象组件):定义了原始对象的接口,装饰器也会实现这个接口。 Concrete Component(具体组件):原始对象,以后装饰器会装饰它。 Decorator(抽象装饰器):关联/聚合了抽象组件,

    2024年02月09日
    浏览(51)
  • Java设计模式之结构型-装饰器模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二  五、总结  装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。 角色 描述 抽象构件 是一个接口或者抽象类,定义我们最核心的对象 具体构件 抽象构件的实现,

    2024年02月11日
    浏览(35)
  • 设计模式-04.01-结构型-代理&桥接&装饰器&适配器

    创建型模式比较好理解,后面的结构型和行为型设计模式不是那么好理解。如果遇到不好理解的设计模式,我一般会在开头举比较简单的Demo案例来帮助理解。 前面几节,我们讲了设计模式中的创建型模式。创建型模式主要解决对象的创建问题,封装复杂的创建过程,解耦对

    2024年02月09日
    浏览(60)
  • 设计模式--------结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构

    2024年02月13日
    浏览(49)
  • 结构型设计模式——桥接模式

    桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。 桥接模式 (Bridge) 是一种结构型设计模式, 可将 抽象 部分与 实现 部分 分离 ,使它们都可以独立的变化。如果一个系统需要在构件的抽象化角色和具体化角色之间增加更

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包