首页 > 其他分享 >设计模式之装饰器模式

设计模式之装饰器模式

时间:2023-07-22 20:34:56浏览次数:31  
标签:coffee GetDescription ICoffee GetCost 模式 public 设计模式 装饰

装饰器模式是一种结构型设计模式,它允许动态地为对象添加新的行为,同时不改变其结构。通过将对象包裹在一个装饰器中,可以在运行时为对象添加额外的功能。

在装饰器模式中,有四个主要角色:

抽象组件(Component):定义了被装饰对象的接口,是装饰器和被装饰对象的共同基类或接口。它声明了一组操作,这些操作可以在具体组件或其装饰器中实现。

具体组件(Concrete Component):实现了抽象组件接口,是被装饰的对象。

抽象装饰器(Decorator):也是抽象组件的子类或接口,持有一个指向抽象组件的引用。它的主要作用是为具体组件或其他装饰器提供一个公共的接口,并在其中维护一些额外的状态和行为。

具体装饰器(Concrete Decorator):实现了抽象装饰器接口,是具体的装饰器类。它在装饰器模式中扮演了具体的装饰角色,对组件进行具体的装饰或增强。

装饰器模式的关键思想是将对象包裹在装饰器中,这样可以在不修改原始对象的情况下,动态地为对象添加新的行为或功能。这种设计模式使得功能的添加和扩展更加灵活,可以组合不同的装饰器,以达到不同的功能组合。

示例:
假设我们有一个简单的咖啡店,其中有一种基本的咖啡(ConcreteComponent),我们可以为这种咖啡添加调料(具体装饰器)来制作各种口味的咖啡。

csharp
Copy code
// 抽象组件
public interface ICoffee
{
string GetDescription();
double GetCost();
}

// 具体组件
public class BasicCoffee : ICoffee
{
public string GetDescription()
{
return "Basic Coffee";
}

public double GetCost()
{
    return 2.0;
}

}

// 抽象装饰器
public abstract class CoffeeDecorator : ICoffee
{
protected ICoffee coffee;

public CoffeeDecorator(ICoffee coffee)
{
    this.coffee = coffee;
}

public virtual string GetDescription()
{
    return coffee.GetDescription();
}

public virtual double GetCost()
{
    return coffee.GetCost();
}

}

// 具体装饰器
public class MilkDecorator : CoffeeDecorator
{
public MilkDecorator(ICoffee coffee) : base(coffee)
{
}

public override string GetDescription()
{
    return base.GetDescription() + ", Milk";
}

public override double GetCost()
{
    return base.GetCost() + 0.5;
}

}

// 具体装饰器
public class SugarDecorator : CoffeeDecorator
{
public SugarDecorator(ICoffee coffee) : base(coffee)
{
}

public override string GetDescription()
{
    return base.GetDescription() + ", Sugar";
}

public override double GetCost()
{
    return base.GetCost() + 0.3;
}

}
在上述示例中,ICoffee是抽象组件接口,BasicCoffee是具体组件实现。CoffeeDecorator是抽象装饰器,MilkDecorator和SugarDecorator是具体装饰器,它们都继承自CoffeeDecorator。通过装饰器,我们可以动态地给咖啡添加不同的调料,而不需要修改咖啡的实现。例如,我们可以通过以下方式为咖啡添加调料:

csharp
Copy code
ICoffee basicCoffee = new BasicCoffee();
Console.WriteLine("Description: " + basicCoffee.GetDescription());
Console.WriteLine("Cost: $" + basicCoffee.GetCost());

ICoffee coffeeWithMilk = new MilkDecorator(basicCoffee);
Console.WriteLine("Description: " + coffeeWithMilk.GetDescription());
Console.WriteLine("Cost: $" + coffeeWithMilk.GetCost());

ICoffee coffeeWithMilkAndSugar = new SugarDecorator(coffeeWithMilk);
Console.WriteLine("Description: " + coffeeWithMilkAndSugar.GetDescription());
Console.WriteLine("Cost: $" + coffeeWithMilkAndSugar.GetCost());
输出结果:

Description: Basic Coffee
Cost: $2
Description: Basic Coffee, Milk
Cost: $2.5
Description: Basic Coffee, Milk, Sugar
Cost: $2.8

通过装饰器模式,我们可以方便地根据需求组合不同的装饰器,从而实现不同的咖啡口味,并且这些功能的扩展是灵活和可维护的。

标签:coffee,GetDescription,ICoffee,GetCost,模式,public,设计模式,装饰
From: https://www.cnblogs.com/yanyuge/p/17574181.html

相关文章

  • Centos 7 单用户模式修改密码/配置
    1、启动系统,启动项界面显示时,按“↑↓”键停留在此界面,按下“e”键进入编辑模式2、利用“↑↓”键找到“linux16”开头的那段,去掉“rhgb”和“quiet”参数,并在“UTF-8”之后添加“init=/bin/sh”3、修改后,按“Ctrl+X”重启系统4、修改根目录的修改权限,并重新挂载(默认只读,不......
  • redis主从模式修改密码
    Redis主从模式修改密码概述在Redis主从模式中,需要修改密码时,需要在主节点上修改密码,并且同步到所有的从节点上。下面将详细介绍如何实现这个过程。修改密码流程下面是修改Redis主从模式密码的流程:步骤描述步骤1连接到主节点步骤2修改主节点密码步骤3获取从......
  • 建造者模式
    建造者模式一场景    在软件开发中,我们有时候会创建一些复杂的对象,这些对象有着复杂的内部结构,它们都是有一系列部件组成。这些部件相互依赖,而且部件的构建通常面临着复杂的变化。我们需要先按照一定的顺序来创建各个部件,最后将这些部件组装成一个完整的对象。  ......
  • Unity编辑模式 一键获取Tilemap的格子信息
    动机由于地图是使用unitytilemap编辑的,服务端也希望获取一份相关的信息。相较于自己写个编辑器,直接利用unity的能力会更加敏捷。效果展示只需要将组件拖拽到含有Tilemap组件的GameObj上面,就可以点击按钮,获取格子信息。源码展示[CustomEditor(typeof(TilemapTool))][CanEdi......
  • ofstream 追加模式
    #includeusingnamespacestd;intmain(){ofstreamoutfile("example.txt",ios::app);if(outfile.is_open()){outfile<<"Thisisanewline.\n";outfile.close();}elsecout<<"Una......
  • 修改MySQL读写模式
    修改MySQL读写模式MySQL是一个开源的关系型数据库管理系统,广泛应用于互联网应用和企业级应用中。在MySQL中,存在着读写模式的设置,可以根据实际需求来调整数据库的读写性能和一致性。本文将介绍如何修改MySQL的读写模式,并提供代码示例。1.了解MySQL读写模式在MySQL中,有两种常见的......
  • OO 设计模式
    面向对象(ObjectOriented-OO)设计模式(DesignPattern)概念、设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结3个大类,23个设计模式、创建型模式:对象实例化的模式单例模式:确保某一个类只有一个实例,并且提供一个全局访问点简单工厂模式:让子类......
  • Spring框架的设计理念与设计模式(4)-Context组件
    关键词:Context,组件,Spring,BeanFactory,容器,Ioc上一章:[b]Spring框架的设计理念与设计模式(3)-Bean组件[/b][url]http://javapub.iteye.com/blog/751550[/url]下一章:[b]Spring框架的设计理念与设计模式(5)-Core组件[/b][url]http://javapub.iteye.com/......
  • MES/MOM国内市场现状趋势与新生态模式参考
    本文分享自华为云社区《工业互联网系列(七)MES/MOM国内市场现状趋势与新生态模式参考》,作者:云起MAE。国内工业互联网平台服务整体围绕数字化及数据价值挖掘的底层逻辑没有变,变的是服务边界的拓展、服务工具的简化。面对国内MES/MOM类生产管理软件供需两端都很痛苦的现状,华为云数字......
  • 接口默认方法,接口应用和适配器设计模式
    静态方法只能通过接口名调用!!! 私有方法主要用于提取两个不同方法的相同部分,两个不同方法分别调用私有方法,从而简化代码 ......