c设计模式之装饰者模式(decoratorpattern)

合集下载

设计模式(三):“花瓶+鲜花”中的装饰者模式(DecoratorPattern)

设计模式(三):“花瓶+鲜花”中的装饰者模式(DecoratorPattern)

设计模式(三):“花瓶+鲜花”中的装饰者模式(DecoratorPattern)在前两篇博客中详细的介绍了""和“”,今天我们就通过花瓶与鲜花的例⼦来类⽐⼀下“装饰模式”(Decorator Pattern)。

在“装饰模式”中很好的提现了开放关闭原则,即类应该对扩展开放对修改关闭。

装饰者模式可以让我们在不对原来代码的修改的情况下对类进⾏扩展。

这也好⽐我们往花瓶⾥插花,我们在插花的时候是不会对花瓶以及原来的话进⾏任何的修改,⽽只管将我们新的花添加进花瓶即可。

这就是我们的装饰者模式。

当然本篇博客中所采⽤的语⾔仍然是Swift语⾔。

装饰者模式,⽤另⼀种表达⽅式就是“对原有的物体进⾏装饰,给原有的物体添加上新的装饰品”。

举个栗⼦,⽐如⼀个礼物,我们要对其进⾏包装,礼物是被装饰者(我们称为组件---Component),⽽包装盒以及包装盒上的花等等就是装饰品(我们成为装饰者---Decorator)。

如果换成花瓶与鲜花的关系,花瓶就是Component,⽽鲜花就是Decorator。

下⽅引⽤了装饰者模式的定义:装饰者模式:动态地将责任附加到对象上。

若要扩展功能,装饰着提供了⽐继承更有弹性的替代⽅案。

⼀、使⽤“类图”分析鲜花+花瓶的装饰关系与之前博客的风格类似,我们还是依托于实例来理解“装饰者模式”,我们就依托于花瓶与鲜花的关系来理解⼀下装饰者模式。

在之前的博客中我们提到过⼀条设计原则“封装变化”,也就是说要将变化的东西进⾏封装提取。

在“装饰者模式”中所使⽤的装饰就是变化的部分,也就是Decorator是变化的部分对应着我们的鲜花,因为往花瓶中插花的过程就是鲜花变化的过程,也就是为花瓶装饰的过程。

⽽花瓶就是组件了。

在“装饰者模式”中需要注意的是,这⾥所谓的装饰者不单单就是我组件添加的新的装饰品。

⼀个装饰者对象就是添加该装饰后的组件,也就是说装饰者=旧组件 + 新装饰品,理解这⼀点是⾮常重要的。

QY03装饰模式

QY03装饰模式

类爆炸!!
Beverage
description getDescription() Cost() //Other methods
HouseBlend DarkRoast Decaf Espresso HouseBlend Cost() Cost() Decaf Cost() Espresso HouseBlend Cost() Cost() HouseBlend Decaf Espresso Cost() Cost() Decaf Cost() Espresso HouseBlend Cost() Cost() Decaf Cost() Espresso HouseBlend Cost() HouseBlendWith Cost() Cost() Cost() Cost() Cost() SteamedMilkandMocha
HouseBlend
Cost()
DarkRoast
Cost()
Decaf
Cost()
Espresso
Cost()
基类的cost()代码应该是怎样的?
Public class Beverage { ... public double cost() {
只计算调料价格
} ...
}
子类的cost()代码应该是怎样的?
Public class DarkRoast extends Beverage { public DarkRoast() { description=“优质DarkRoast咖啡”; } public double cost() {
计算完整的咖啡价格, 包括调料的价格
}
} ...
Beverage
description
getDescription() cost() hasMilk() setMilk() hasSoy() setSoy() … //Other methods

设计模式.装饰模式(Decorator)

设计模式.装饰模式(Decorator)
需要扩展一个类的行为,但由 于继承为类带来了过多的复杂
性或者继承层次过深。
需要对一组基本功能进行排列 组合以产生非常多的功能,而 使用继承关系很难实现这样的 需求。
需要在不修改现有代码的情况 下对程序进行功能扩展。
02
装饰模式的实现方式
继承实现方式
1 2 3
优点
代码简洁,易于理解。
缺点
不够灵活,每增加一个新的装饰功能,都需要创 建一个新的子类,类数量会急剧增加,导致系统 庞大和复杂。
03 需要对一组基本功能进行排列组合以产生非常多 的功能。
对未来研究的展望
深入研究装饰模式的适用场 景和最佳实践,以便更好地 应用该模式解决实际问题。
研究如何将装饰模式与其 他设计模式结合使用,以 产生更好的设计效果。
ABCD
探索如何降低装饰模式的 复杂性,提高代码的可读 性和维护性。
关注新兴技术和编程语言对装 饰模式的影响,以便及时调整 和更新该模式的应用方式。
可能破坏封装性
在使用装饰模式时,需要注意不要破坏对象的封 装性。如果装饰器暴露了对象的内部状态或实现 了不应该暴露的方法,那么可能会导致系统的不 稳定性和安全性问题。
06
总结与展望
对装饰模式的总结
优点 装饰模式可以在不改变对象自身的基础上,动态地给对象添加一些额外的职责。
装饰模式可以在运行时选择性地添加或删除某些功能,提高了系统的灵活性。
统或类的整合和简化。
03
透明性不同
装饰模式对客户端是透明的,客户端可以无感知地使用被装饰的对象,
而外观模式则可能需要对客户端进行一定的定制,以提供简化的接口。
与桥接模式的比较
目标不同
装饰模式的目标是动态地给一个对象添加一些额外的职责, 而桥接模式的目标是将抽象部分与它的实现部分分离,使 它们都可以独立地变化。

23种设计模式记忆口诀

23种设计模式记忆口诀

23种设计模式记忆口诀设计模式是软件开发中常见的解决方案模板,它们能够解决许多常见的设计问题。

为了帮助记忆23种设计模式,可以使用下面这个口诀来记忆:Creational Patterns(创建型模式):1. Singleton(单例模式):一个类能产生一个实例,全局访问。

2. Builder(建造者模式):分步骤创建复杂对象,易拓展。

3. Factory Method(工厂方法模式):子类决定实例化哪个对象。

4. Abstract Factory(抽象工厂模式):创建一组相关对象,不依赖具体类。

5. Prototype(原型模式):通过复制现有对象来创建新对象。

Structural Patterns(结构型模式):6. Adapter(适配器模式):将类的接口转换为客户端希望的接口。

7. Bridge(桥接模式):将抽象部分与实际部分分离。

将对象组合成树形结构来表示部分整体的层次结构。

9. Decorator(装饰器模式):动态地给对象添加功能。

10. Facade(外观模式):提供一个统一的接口,简化客户端使用。

11. Flyweight(享元模式):共享细粒度对象,减少内存使用。

12. Proxy(代理模式):控制对其他对象的访问。

Behavioral Patterns(行为型模式):13. Chain Of Responsibility(责任链模式):将请求的发送者和接收者解耦,多个对象都可能处理请求。

将请求封装成对象,可以用参数化方式处理。

15. Iterator(迭代器模式):提供一种遍历集合的统一接口。

16. Mediator(中介者模式):将多个对象之间的复杂关系解耦。

17. Memento(备忘录模式):将对象的状态保存起来,以后可以恢复。

18. Observer(观察者模式):当一个对象改变状态时,依赖它的对象都会收到通知。

19. State(状态模式):对象的行为随状态的改变而改变。

编程中的设计模式:8个常见模式解析

编程中的设计模式:8个常见模式解析

编程中的设计模式:8个常见模式解析设计模式是软件开发中常见的一种解决问题的思想模式,它是一种经过多次实践总结出来的在特定情境下,对特定问题的解决方案。

设计模式通过将经典的经验进行抽象,然后形成模式来指导软件开发工程师进行设计和开发。

下面将介绍8个常见的设计模式。

1.工厂模式(Factory Pattern)工厂模式是一种创建型模式,用于创建对象的过程中隐藏了具体的实现细节,只暴露了一个工厂类的接口。

工厂模式可以根据不同的参数或条件,动态地返回不同的具体对象,达到解耦的效果,提高了代码的灵活性和可维护性。

2.单例模式(Singleton Pattern)单例模式是一种创建型模式,保证一个类只有一个实例,并提供全局访问点,同时对外部隐藏了具体的创建过程。

单例模式可以用于实现全局资源的管理,例如线程池、数据库连接等,避免了资源的创建和销毁过程中的开销问题。

3.观察者模式(Observer Pattern)观察者模式是一种行为型模式,定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,其相关依赖对象都能够得到通知和更新。

观察者模式可以实现松耦合的通信方式,增加了对象之间的交互性,提高了系统的可扩展性和可维护性。

4.策略模式(Strategy Pattern)策略模式是一种行为型模式,定义了一系列算法或行为,将它们封装起来并可以相互替换。

策略模式使得算法的变化不会影响到调用算法的客户端,提高了代码的可复用性和可维护性。

5.装饰器模式(Decorator Pattern)装饰器模式是一种结构型模式,可以动态地给一个对象添加一些额外的职责,而无需对原始对象进行修改。

装饰器模式通过组合的方式,将一系列装饰器对象包裹在被装饰对象的外部,从而在运行时动态地扩展对象的功能。

6.适配器模式(Adapter Pattern)适配器模式是一种结构型模式,用于将一个类的接口转换成客户端所期望的接口。

适配器模式中,适配器类是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成另一个接口,从而可以让它们能够正常地协同工作。

装饰器模式(Decorator)——深入理解与实战应用

装饰器模式(Decorator)——深入理解与实战应用

装饰器模式(Decorator)——深⼊理解与实战应⽤ 本⽂为原创博⽂,转载请注明出处,侵权必究! 1、初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进⾏装饰,以此来扩展⼀些功能。

其结构图如下:Component为统⼀接⼝,也是装饰类和被装饰类的基本类型。

ConcreteComponent为具体实现类,也是被装饰类,他本⾝是个具有⼀些功能的完整的类。

Decorator是装饰类,实现了Component接⼝的同时还在内部维护了⼀个ConcreteComponent的实例,并可以通过构造函数初始化。

⽽Decorator本⾝,通常采⽤默认实现,他的存在仅仅是⼀个声明:我要⽣产出⼀些⽤于装饰的⼦类了。

⽽其⼦类才是赋有具体装饰效果的装饰产品类。

ConcreteDecorator是具体的装饰产品类,每⼀种装饰产品都具有特定的装饰效果。

可以通过构造器声明装饰哪种类型的ConcreteComponent,从⽽对其进⾏装饰。

2、最简单的代码实现装饰器模式//基础接⼝public interface Component {public void biu();}//具体实现类public class ConcretComponent implements Component {public void biu() {System.out.println("biubiubiu");}}//装饰类public class Decorator implements Component {public Component component;public Decorator(Component component) {ponent = component;}public void biu() {ponent.biu();}}//具体装饰类public class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void biu() {System.out.println("ready?go!");ponent.biu();}} 这样⼀个基本的装饰器体系就出来了,当我们想让Component在打印之前都有⼀个ready?go!的提⽰时,就可以使⽤ConcreteDecorator类了。

装饰者模式的使用方法和案例分享

装饰者模式的使用方法和案例分享

装饰者模式的使用方法和案例分享装饰者模式(Decorator Pattern)是一种常用的设计模式,在软件开发中十分实用。

它能够动态地将责任附加到对象上,从而实现对象功能的扩展,同时避免重复代码的产生。

本文将介绍装饰者模式的使用方法以及一些实际案例的分享。

一、装饰者模式的定义装饰者模式是指在不改变原有对象结构的情况下,动态地扩展该对象的功能。

该模式通过一种装饰器对象来包裹原有对象,并在运行时动态地添加新的行为。

二、装饰者模式的实现装饰者模式的实现需要定义一个包装类和一个抽象组件类。

包装类实现了抽象组件类,并定义了一个指向抽象组件类的指针,从而实现对抽象组件类的扩展。

抽象组件类是被装饰的类,定义了抽象接口。

三、装饰者模式的优点1. 可以动态地添加或删除功能。

2. 可以避免重复代码的产生,减少代码的复杂程度。

3. 可以提高代码的可扩展性和维护性。

四、装饰者模式的实际案例分享1. Java I/O模块Java I/O模块是一个典型的使用装饰者模式的实例。

Java I/O模块通过InputStream和OutputStream来处理输入输出流,通过FileInputStream和FileOutputStream来处理文件输入输出流,同时还可以通过BufferedInputStream和BufferedOutputStream来实现缓冲输入输出流和过滤输入输出流。

这些类的组合和复合就是通过装饰者模式实现的,从而实现了输入输出流的灵活性和可扩展性。

2. GUI开发中的控件美化在GUI开发中,控件美化也是一个典型的应用场景。

通过使用装饰者模式,可以动态地修改一个控件的外观和功能,而不需要修改源代码。

例如,可以通过直接继承一个控件类,实现控件的装饰,从而实现控件的美化。

3. 日志记录日志记录也是一个常见的应用场景。

通过使用装饰者模式,可以自定义不同类型的日志记录器,从而实现日志记录的灵活性和可扩展性。

例如,可以自定义一个输出到数据库的日志记录器,一个输出到文件的日志记录器等。

面向对象的软件设计实践

面向对象的软件设计实践

面向对象的软件设计实践随着现代信息技术的高速发展,软件开发已经成为了人们生活和工作中不可或缺的一部分。

而面向对象的软件设计方法已经成为了一种被广泛采用的设计方法,它可以有效地提高软件的可维护性、可扩展性和可重用性。

面向对象的软件设计方法以对象为中心,将实体的抽象化作为核心思想,利用类、继承、多态等概念,来描述系统中的各种实体对象及其相互关系。

采用这些概念,可以将系统中的复杂对象进行有效地分解,并将它们之间的关系以及行为特性进行描述,然后将这些描述用软件工具来实现。

面向对象的软件设计方法是一个非常重要的概念,也是软件开发工程学科中的基础概念。

下面,本文将从各个方面来介绍面向对象的软件设计实践。

一、面向对象的设计原则在进行面向对象的软件设计时,我们需要尊重一些基本原则。

这些原则可以提高我们软件设计的质量和效率。

以下是一些重要的面向对象的设计原则:1、单一职责原则(SRP)这一原则也叫“单一功能原则”。

它指出一个类应该只有一个单一的职责。

也就是说,一个类只应该有一个引起它变化的原因。

SRP原则可以帮助我们提高代码的可重用性和可维护性。

2、开闭原则(OCP)这一原则指出“开放-封闭”原则。

软件的设计应该是开放扩展的但是封闭修改的。

换句话说,对于那些高度可变的需求,我们应该保持系统的灵活性以使之适应这些变化,但是我们不应该去打破那些已经运作良好的模块。

3、接口隔离原则(ISP)这一原则指出,应该为每一个客户端定制一个接口,而不是为一个类定制一个庞大而臃肿的接口。

这个原则可以帮助我们提高系统的可扩展性和可维护性。

4、依赖倒置原则(DIP)这一原则指出,应该依赖于抽象而不是具体的实现。

通过DIP原则,我们可以减小不同模块之间的关联度,从而提高系统的模块化程度。

二、面向对象的设计模式面向对象的设计方法是建立在设计模式之上的,设计模式可以视为软件设计界的调配图谱。

在面向对象软件设计中,有很多模式可以提高我们的设计效率和质量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C# 设计模式之装饰者模式(Decorator Pattern)
1.概述
装饰者模式,英文名叫做Decorator Pattern 。

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一
个对象的功能。

它是通过创建一个包装对象,也就是装饰来
包裹真实的对象。

2.特点
(1)装饰对象和真实对象有相同的接口。

这样客户端对象就可以和真实对象相同的方式和装饰对象交互。

(2 )装饰对象包含一个真实对象的引用
(reference )(3)装饰对象接受所有来自客户端的请求。

它把这些请求转发给真实的对象。

( 4 )装饰对象可以在转发这些请求以前或以后增加一些附加功能。

这样就确保了在运行时,不用修改给定对象的
结构就可以在外部增加附加的功能。

在面向对象的设计中,
通常是通过继承来实现对给定类的功能扩展。

3.应用范围
1.需要扩展一个类的功能,或给一个类添加附加职责。

2.需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

3.需要增加由一些基本功能的排列组合而产生的非常大
量的功能,从而使继承关系变的不现实
4.当不能采用生成子类的方法进行扩充时。

一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。

另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

4.优点
1.Decorator 模式与继承关系的目的都是要扩展对象的
功能,但是Decorator 可以提供比继承更多的灵活性。

2.通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

(这一条更能体现)
5.缺点
1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。

2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。

3.装饰模式是针对抽象组件 ( Component )类型编程。

但是,如果你要针对具体组件编程时,就应该重新思考你的
应用架构,以及装饰者是否合适。

当然也可以改变Component 接口,增加新的公开的行为,实现“半透明”的装饰者模
式。

在实际项目中要做出最佳选择
6.设计原则
1. 多用组合,少用继承。

利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。

然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。

2. 类应设计的对扩展开放,对修改关闭。

8. 模式简化(最后会给出 2 种写法仅供参考)
1. 如果只有一个Concrete Component 类而没有抽象的Component 接口时,可以让Decorator 继承Concrete Component 。

2. 如果只有一个Concrete Decorator 类时,可以将Decorator 和Concrete Decorator 合并。

9.代码示例
( 1 )抽象接口
///
/// 定义Component 对象接口
/// public abstract class Component
{
public abstract void Operation();// 一个抽象的职责}
///
/// 具体对象
///
class ConcreteComponent : Component {
public override void Operation()
{
Console.WriteLine(" 具体对象的操作");
}
}
//装饰者抽象类
abstract class Decorator : Component
{ protected Component component;
public void SetComponent(Component component)
{ ponent = component; } public override void
Operation()
if (component != null) {
component.Operation();
}
}
} class ConcreteDecoratorA : Decorator
{ public override void Operation()
{ base.Operation(); // 首先运行原Compnent 的Operation (),再执行本类的功能,如AddedBehavior, 相当于对原Component 进行了装饰Console.WriteLine(" 具体装饰对象 A 的操作");
}
}
class ConcreteDecoratorB : Decorator
{ public override void Operation()
{ base.Operation(); // 首先运行原Compnent 的Operation (),再执行本类的功能,如AddedBehavior, 相当于对原Component 进行了装饰Console.WriteLine(" 具体装饰对象 B 的操作");
2)无抽象接口
public class Car
{
public virtual void Description()
{
Console.Write(" 基本");
}
} public class ESPDecorator : Car
{
Car car;
public ESPDecorator(Car car)
{ this.car = car;
}
public override void Description()
{ car.Description();
Console.WriteLine(" 带有ESP 功能");
public class OtherDecorator : Car
{
Car car;
public OtherDecorator(Car car)
{ this.car = car;
}
public override void Description()
{
car.Description();
Console.WriteLine(" 带有其它功能");
}
}
代码调用
//第一种
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
d1.SetComponent(c);
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d2.SetComponent(c);
d2.Operation();
//第二种
Car car = new ESPDecorator(new OtherDecorator(new Car()));
car.Description();
Console.Read(); 人生若只如初见,何事西风悲画扇? 等闲变却故人心,却道故人心易变. 标签: 设计模式, 装饰者模式。

相关文档
最新文档