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

装饰器模式

时间:2023-05-29 13:45:14浏览次数:24  
标签:Drink get drink 模式 public new 装饰 drink2

一、定义

装饰器模式动态地给一个对象增加一些额外的职责。就增加功能而言,装饰器模式比生成子类更为灵活。

二、UML类图

三、示例

需求:假设开一个奶茶店,奶茶种类繁多,如红豆奶茶,布丁奶茶,珍珠奶茶,红豆珍珠奶茶等,并根据不同配料计算价格,并且根据每个客户的要求,每种奶茶又可以加糖或者加冰,加糖加冰不额外收费。

通过组合+继承的方式改进,可使得饮品的扩展更灵活,同时也遵守了开闭原则。其中,组合是为了实现功能,而继承是为了约束类型,这其实就是装饰者模式。

代码:

1.Drink.cs

public abstract class Drink
    {
        public string Name { get; set; }

        public int Price { get; set; }

        public abstract string Desc { get; }

        public abstract int Cost { get; }
    }

2.Naicha.cs

public class Naicha : Drink
    {
        public Naicha()
        {
            Name = "奶茶";
            Price = 8;
        }
        public override string Desc => this.Name;
        public override int Cost => this.Price;
    }

3.Peiliao.cs

public class Peiliao:Drink
    {
        protected readonly Drink Drink;

        public Peiliao(Drink drink)
        {
            Drink = drink;
        }

        public override string Desc
        {
            get
            {
                return Drink.Desc + "+" + this.Name;
            }
        }

        public override int Cost
        {
            get
            {
                return Drink.Cost + this.Price;
            }
        }
    }

4.Hongdou.cs

public class Hongdou : Peiliao
    {
        public Hongdou(Drink drink) : base(drink)
        {
            Name = "红豆";
            Price = 1;
        }
    }

5.Program.cs

internal class Program
    {
        static void Main(string[] args)
        {
            Drink drink = new Naicha();
            drink = new Hongdou(drink);
            drink = new Bing(drink);
            drink = new Buding(drink);
            Console.WriteLine($"描述:{drink.Desc},价格:{drink.Cost}");

            Drink drink2 = new Kafei();
            drink2 = new Kafeibanlv(drink2);
            drink2 = new Tang(drink2);
            Console.WriteLine($"描述:{drink2.Desc},价格:{drink2.Cost}");
        }
    }

运行结果:

 

四、总结

优缺点
1.优点
可动态的给一个对象增加额外的职责
有很好地可扩展性
2.缺点
增加了程序的复杂度,刚接触理解起来会比较困难

 

标签:Drink,get,drink,模式,public,new,装饰,drink2
From: https://www.cnblogs.com/xiao-wo-niu/p/17440183.html

相关文章

  • 聊聊分布式解决方案Saga模式
    Saga模式Saga模式使用一系列本地事务来提供事务管理,而一个本地事务对应一个Saga参与者,在Saga流程里面每一个本地事务只操作本地数据库,然后通过消息或事件来触发下一个本地事务,如果其中一个本地事务失败了,Saga就会执行一系列补偿事务来实现回滚操作。(补偿事务简单来讲就是对之前本......
  • 责任链模式
    将一堆“事情”串联在一起,有序执行,就叫责任链一、概述责任链模式(ChainofResponsibilityPattern)是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象......
  • 观察者模式
    一、观察者模式1、概念描述观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主题对象在状态发生变化时,会通知所有观察者对象。Redis和常用消息中间件的发布订阅模式,都是基于该原......
  • 过滤器链及责任链设计模式
    过滤器链:在JavaWeb应用中,多个过滤器的执行顺序是有规定的,称之为过滤器链。按照过滤器链的规定,多个过滤器会按照它们在web.xml文件中配置的先后顺序依次执行。具体来说,假设一个请求需要经过三个过滤器,分别为Filter1、Filter2和Filter3,那么它们的执行顺序为:客户端发送请......
  • Go:build模式和options模式
    build模式和options模式packagemainimport"fmt"//Server初始化可选参数的typeServerstruct{urlstringportstringprotocolstringoptionstring}//定义函数类型typeModOptionfunc(option*Server)//将函数类型传入,然后再内部调用func......
  • SNP一文解答SAP云迁移的四种部署模式
    为了方便不同需求的用户,多云计算提供商提供了多种形式的云服务,常见的有公有云、私有云、混合云和社区云等。私有云(PrivateClouds)是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私......
  • 单例模式 和 静态成员 孰优孰劣?
    单例)单例模式比静态方法有很多优势:首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;再次,单例类可以被集成,他的方法可以被覆写;最后,或许最重要的是,单例类可以被用于多态而无需强迫用户只假定唯一的......
  • apache几种工作模式对比
    apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm选项来决定apache2的工作模式。如果知道当前的apache2使用什么工作机制,可以通过httpd-l命令列出apache的所有模块,就可以知道其工作方式:prefork:如果httpd-l列出prefork.c,则需要对下面的段进行配置:<IfM......
  • AIGC赛道5种不同的营收模式
    1,MaaS(ModelasService) 适用于底层大模型和中间层进行变现,按照数据请求量和实际计算量计算。到2027年,MaaS模式占市场规模比例将从5%增长至47%。2,按产出内容量收费适用于应用层变现,如按图片张数、请求计算量、模型训练次数等收费。到2027年,该模式市场规模占比将从60%......
  • kube-proxy的iptables与ipvs模式性能对比与分析
    kube-proxy的iptables与ipvs模式性能对比与分析背景:iptables代理模式iptables是一个Linux内核功能,旨在成为一种高效的防火墙,具有足够的灵活性来处理各种常见的数据包操作和过滤需求。它允许将灵活的规则序列附加到内核数据包处理管道中的各种钩子上。在iptables模式下,kube-p......