当前位置: 首页 > news >正文

设计模式-装饰者模式

概述

装饰者模式也是一种结构类型设计模式它可以在不改变原有结构的情况下为对象添加新的功能,和组合模式有类似的地方,满足开闭原则。主要组成部分有,装饰者装饰者接口装饰功能,然后就可以根据对应的需求,用装饰功能装饰装饰者。


需求:需要为三个小朋友装饰服饰,小明需要衣服,小张需要衣服和帽子,小红需要衣服,帽子和鞋子

装饰者模式

internal class Program
{private static void Main(string[] args){IDecorator XiaoMing = new Person("小明:");IDecorator cloth = new Clothing(XiaoMing);Console.WriteLine(cloth.Dicoration());IDecorator XiaoZhang = new Person("小张:");IDecorator CH = new Clothing(new Hat(XiaoZhang));Console.WriteLine(CH.Dicoration());IDecorator XiaoHong = new Person("小红:");IDecorator CHS = new Clothing(new Hat(new Shoe(XiaoHong)));Console.WriteLine(CHS.Dicoration());}public interface IDecorator//装饰者接口{string Dicoration();}public class Person : IDecorator//人{private readonly string _Name;public Person(string name){_Name = name;}public string Dicoration(){return _Name;}}public abstract class PersonDecorator : IDecorator//装饰者抽象类{protected IDecorator _Decorator;public PersonDecorator(IDecorator decorator){_Decorator = decorator;}public abstract string Dicoration();}public class Clothing : PersonDecorator//衣服{public Clothing(IDecorator decorator) : base(decorator) { }public override string Dicoration(){return _Decorator.Dicoration()+" 衣服";}}public class Hat : PersonDecorator//帽子{public Hat(IDecorator decorator) : base(decorator) { }public override string Dicoration(){return _Decorator.Dicoration()+" 帽子";}}public class Shoe : PersonDecorator//鞋子{public Shoe(IDecorator decorator) : base(decorator) { }public override string Dicoration(){return _Decorator.Dicoration() + " 鞋子";}}
}

输出

小明: 衣服
小张: 帽子 衣服
小红: 鞋子 帽子 衣服

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ubuntu创建txt
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂
  • 搅拌站智能化改造,数字化管理如何助力降本增效?
  • 走心解答hashCode与equals,尽量说明白
  • Windows图形界面(GUI)-MFC-C/C++ - 树形视图(Tree Control) - CTreeCtrl
  • 超声波眼镜清洗机哪个更好用?四款清洁力强的超声波清洗机推荐
  • 24.8.9.11数据结构|链栈和队列
  • 程序人生-Hello’s P2P
  • vue3引入模块报错:无法找到模块“xxx”的声明文件
  • Java 守护线程练习 (2024.8.12)
  • linux 下 QT5如何编译成32位或64的方法
  • 小白零基础学数学建模系列-Day3-线性回归模型的构建与评估
  • 基于STM32开发的智能农业环境监测系统
  • 看过来!数学建模国赛常见问题汇总
  • 全面介绍`npm`的基本使用
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Apache的基本使用
  • Codepen 每日精选(2018-3-25)
  • iOS编译提示和导航提示
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • js写一个简单的选项卡
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux链接文件
  • MobX
  • Python3爬取英雄联盟英雄皮肤大图
  • Python十分钟制作属于你自己的个性logo
  • python学习笔记 - ThreadLocal
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SegmentFault 2015 Top Rank
  • SpringBoot几种定时任务的实现方式
  • 和 || 运算
  • 首页查询功能的一次实现过程
  • 网络应用优化——时延与带宽
  • 详解移动APP与web APP的区别
  • 进程与线程(三)——进程/线程间通信
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #laravel 通过手动安装依赖PHPExcel#
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (一)kafka实战——kafka源码编译启动
  • ***详解账号泄露:全球约1亿用户已泄露
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET Core中如何集成RabbitMQ
  • .net 提取注释生成API文档 帮助文档
  • .net 无限分类
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net开发时的诡异问题,button的onclick事件无效
  • /*在DataTable中更新、删除数据*/
  • /bin、/sbin、/usr/bin、/usr/sbin
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @PreAuthorize与@Secured注解的区别是什么?
  • [ Socket学习 ] 第一章:网络基础知识