C#设计模式之9-装饰者模式
装饰者模式(Decorator Pattern)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/405 访问。
装饰者模式属于结构型模式,装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。
装饰者模式通过创建一个包装对象(wrapper),也就是用装饰来包裹真实的对象。
角色:
1、抽象构件(Component)
给出一个抽象接口,以规范准备接收附加责任的对象;
2、具体构件(Concrete Component)
定义一个将要接收附加责任的类;
3、抽象装饰(Decorator)
持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口;
4、具体装饰(Concrete Decorator)
负责给构件对象添加上附加的责任。
示例:
命名空间DecoratorPattern中包含汽车Car类、玛莎拉蒂Maserati类、法拉利Fabbrica类、酷汽车CoolCar类、汽车车贴Paster类和汽车遮阳挡Visor类。本示例通过使用装饰者模式为汽车进行一次简单的外观装饰。
namespace DecoratorPattern
public abstract class Car {
public string Name { get; set; }
public abstract void StartUp();
}
汽车基类Car,充当抽象构件。
public class Fabbrica : Car {
public Fabbrica() {
Name = "Fabbrica";
}
public override void StartUp() {
Console.WriteLine($"{Name} is starting!");
}
}
法拉利Fabbrica类,充当具体构件。
public class Maserati : Car {
public Maserati() {
Name = "Maserati";
}
public override void StartUp() {
Console.WriteLine($"{Name} is starting!");
}
}
玛莎拉蒂Maserati类,充当具体构件。
public abstract class CoolCar : Car {
protected Car _car = null;
public CoolCar(Car car) {
_car = car;
}
public override void StartUp() {
Console.WriteLine($"{_car.Name} is starting!");
}
}
酷汽车CoolCar类,充当抽象装饰。
public class Paster : CoolCar {
public Paster(Car car) : base(car) {
}
public override void StartUp() {
SetPaster();
base.StartUp();
}
private void SetPaster() {
Console.WriteLine($"Set paster to {_car.Name}!");
}
}
汽车车贴Paster类,通过继承CoolCar类,为对汽车进行装饰提供了可能。
public class Visor : CoolCar {
public Visor(Car car) : base(car) {
}
public override void StartUp() {
SetVisor();
base.StartUp();
}
private void SetVisor() {
Console.WriteLine($"Set visor to {_car.Name}!");
}
}
汽车遮阳挡Visor 类,通过继承CoolCar类,为对汽车进行装饰提供了可能。
public class Program {
private const string LINE_SPLIT = "-------------------------";
private static Car _car = null;
private static CoolCar _coolCar = null;
public static void Main(string[] args) {
_car = new Maserati();
_coolCar = new Visor(_car);
_coolCar.StartUp();
Console.WriteLine(LINE_SPLIT);
_car = new Fabbrica();
_coolCar = new Paster(_car);
_coolCar.StartUp();
Console.WriteLine(LINE_SPLIT);
Console.ReadKey();
}
}
以上是调用方的代码,以下是这个案例的输出结果:
Set visor to Maserati!
Maserati is starting!
-------------------------
Set paster to Fabbrica!
Fabbrica is starting!
-------------------------
优点:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/405 访问。
1、装饰者模式与继承关系的目的都是要扩展对象的功能,但是装饰者模式可以提供比继承更多的灵活性;
2、通过使用不同的具体装饰类以及这些装饰类的排列组合,开发者可以创造出很多不同行为的组合。
缺点:
1、这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性;
2、装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂;
3、装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
使用场景:
1、需要扩展一个类的功能,或给一个类添加附加职责;
2、需要动态的给一个对象添加功能,这些功能可以再动态的撤销;
3、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实;
4、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸式增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
C#设计模式之9-装饰者模式的更多相关文章
- JAVA设计模式之【装饰者模式】
JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 【读书笔记】读《JavaScript设计模式》之装饰者模式
一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...
- 设计模式学习心得<装饰器模式 Decorator>
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...
- 设计模式のDecoratorPattern(装饰器模式)----结构模式
一.产生背景 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- 设计模式C++实现——装饰者模式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/28633123 模式定义: 装 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- 《Head First 设计模式》之装饰者模式
作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html 模式名称 装饰者模式(Decorator Pattern) 需求 定义咖啡厅中的 ...
- 设计模式学习之装饰者模式(Decorator,结构型模式)(16)
参考地址:http://www.cnblogs.com/zhili/p/DecoratorPattern.html 一.定义:装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相 ...
- [设计模式] javascript 之 装饰者模式
装饰者模式说明 说明:通一个类来动态的对另一个类的功能对象进行前或后的修饰,给它辅加一些额外的功能; 这是对一个类对象功能的装饰,装饰的类跟被装饰的类,要求拥有相同的访问接口方法(功能),这在动态面向 ...
随机推荐
- Python Ethical Hacking - Intercepting and Modifying Packets
INTERCEPTING & MODIFYING PACKETS Scapy can be used to: Create packets. Analyze packets. Send/rec ...
- JQuery如何在验证表单失败的情况下阻止表单提交
自定义验证时,使用了return false和event.preventDefault(),但是验证失败之后表单还是提交了 这个问题我也碰到了,尝试了多次也没有用,在调试的时候也发现确实return了 ...
- Spring事务源码分析专题(一)JdbcTemplate使用及源码分析
Spring中的数据访问,JdbcTemplate使用及源码分析 前言 本系列文章为事务专栏分析文章,整个事务分析专题将按下面这张图完成 对源码分析前,我希望先介绍一下Spring中数据访问的相关内容 ...
- Mybatis核心模块简介
Configuration 主要字段 Environment:配置DataSource和TransactionFactory ObjectFactory:bean工厂 MapperRegistry:M ...
- Nginx(一)Linux上的Nginx安装步骤
一.Windows下安装 解压:nginx-windows 双击: nginx.exe 能看到nginx欢迎界面说明,nginx安装成功 演示下 nginx做静态服务器 二.Linux下安装 (1). ...
- springboot项目部署到tomcat步骤以及常见问题
------------恢复内容开始------------ 本文分为两个部分,一,是打包的步骤,二,是我项目中所遇到的问题以及解决方法 一. 打包为war包步骤 1.修改打包方式为war 在pom. ...
- LQB2013A05前缀判断
上一道题,,,把if条件写错了,,,,找了半天的bug我都快哭了, 好了好了 看见这种填空题,先理解题意 然后把代码copy下来,把空格注释掉,然后运行到编译没有错. 再理一下它的思路 // // C ...
- LIMS/QMS产品索引
Starlims https://www.cnblogs.com/mahongbiao/p/12863304.html 客户申请门户/客户服务门户 https://www.cnblogs.com/ma ...
- 不使用字体图标和图片,只使用css如何做出展开收起的效果
<i class="iconArrow" :class="[ littleNavState === item.meta.id ? 'arrowOpen' : '' ...
- 时间序列ARIMA模型
时间序列ARIMA模型 1.数据的平稳性与差分法 让均值和方差不发生明显的变化(让数据变平稳),用差分法 2.ARIMA模型-----差分自回归平均移动模型 求解回归的经典算法:最大似然估计.最小二乘 ...