装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
适用范围
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。不改变接口的前提下,增强所考虑的类的性能。
1)需要扩展一个类的功能,或给一个类增加附加责任。
2)需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
3)需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得 不现实。
抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类
装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ConcreteDecorator):负责给构件对象“贴上”附加的责任
public class Person
{
public Person()
{ }
private string name;
public Person(string name)
{
this .name = name;
}
public virtual void Show()
{
Console.WriteLine("装扮的{0}",name);
}
}
//抽象装扮
class Finery : Person
{
protected Person component;
//打扮
public void Decorate(Person componnent)
{
this.component = componnent;
}
public override void Show()
{
if (component != null)
{
component.Show();
}
}
//具体服饰类
class Tshirt : Finery
{
public override void Show()
{
Console.WriteLine("T恤");
base.Show();
}
}
class BigTrouse : Finery
{
public override void Show()
{
Console.WriteLine("垮裤");
base.Show();
}
}
客户端
public static void Main(String[] args)
{
Person zy = new Person("小菜");
Console.WriteLine("第一种装扮");
Tshirt T = new Tshirt();
BigTrouse B = new BigTrouse();
T.Decorate(zy);
B.Decorate(T);
B.Show();
Console.WriteLine();
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变现有对象结构的情况下,动态地将新功能添加到对象中。
在装饰模式中,有四个主要角色:
抽象组件(Component):定义了被装饰对象的接口,可以是抽象类或接口。
具体组件(ConcreteComponent):实现了抽象组件的接口,是被装饰的对象。
抽象装饰器(Decorator):继承或实现抽象组件,并持有一个抽象组件的引用,以便可以对被装饰对象进行装饰。
具体装饰器(ConcreteDecorator):实现抽象装饰器的接口,负责给被装饰对象添加新的功能。
装饰模式的工作原理如下:
客户端创建一个具体组件对象,并用抽象组件类型的变量引用它。
客户端可以选择创建一个或多个具体装饰器对象,并用抽象装饰器类型的变量引用它们。
客户端将具体组件对象作为参数传递给具体装饰器对象的构造函数,以便将装饰器与组件关联起来。
客户端使用装饰器对象调用方法,从而在不改变组件接口的情况下,动态地添加新的功能。
装饰模式的优点包括:
装饰模式遵循开闭原则,允许在不修改已有代码的情况下,动态地添加新的功能。
装饰模式将每个功能单独封装在具体装饰器中,使得每个装饰器的职责清晰明确,易于理解和维护。
装饰模式允许多个装饰器同时装饰一个对象,从而提供了灵活性和可组合性。
装饰模式避免了使用继承来扩展功能的问题,避免了类爆炸的情况。
装饰模式的缺点包括:
装饰模式增加了许多具体装饰器类和抽象装饰器类,增加了系统的复杂性。
装饰模式会导致装饰链的嵌套,使得调试和定位问题变得困难。
总结起来,装饰模式是一种灵活且可扩展的设计模式,它通过将功能封装在装饰器中,实现了动态地添加新功能而不改变现有对象结构的目的。
装饰模式是一种结构型设计模式,它允许你在不改变现有对象结构的情况下,动态地向对象添加新的功能。装饰模式通过创建一系列装饰器来包装原始对象,从而在不修改原始对象的情况下为其添加功能。以下是装饰模式的特点和多个维度的解释:
透明性: 装饰模式可以使装饰器和原始对象具有相同的接口,从而使客户端不需要知道装饰器的存在。这种透明性使得客户端代码可以无缝地使用装饰后的对象,就像使用原始对象一样。
多层嵌套: 装饰模式允许在一个对象上嵌套多个装饰器,从而实现多个功能的组合。每个装饰器可以添加独特的行为,形成一个功能堆叠。
单一职责原则: 装饰模式遵循单一职责原则,因为每个具体的装饰器只关注一个特定的功能,从而保持了类的简单性和可维护性。
灵活性: 装饰模式提供了一种动态添加功能的方法,而不需要修改已有代码。这使得您可以在运行时根据需要选择不同的装饰器,以满足特定的要求。
解耦: 装饰模式可以将功能的添加与核心业务逻辑分离开来,从而减少了原始对象类的复杂性。这样一来,您可以专注于核心逻辑而不必担心各种功能的交织。
继承和组合: 装饰模式通过组合取代了传统的继承扩展。它允许您在运行时选择添加功能,而不是在编译时决定继承的结构。
代码重用: 装饰模式可以促进代码重用,因为您可以将不同的装饰器应用于不同的对象,从而共享一些相似的功能。
易于扩展: 当需要添加新的功能时,您可以创建新的装饰器而不必修改已有的代码。这使得系统更具扩展性。
可组合性: 您可以将多个装饰器按照需要组合在一起,形成复杂的功能组合,而不必担心功能之间的冲突。
总之,装饰模式是一种强大的设计模式,可以在不改变已有代码的情况下为对象添加新的功能。它提供了灵活性、可扩展性和解耦的优势,使得您的代码更具适应性和可维护性。