设计模式 - 装饰模式

目录

    • 什么是装饰模式?
    • 何时使用:
    • 角色构成
    • 结构图
    • 代码
    • 总结
    • 特点

什么是装饰模式?

装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
适用范围

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。不改变接口的前提下,增强所考虑的类的性能。

何时使用:

1)需要扩展一个类的功能,或给一个类增加附加责任。

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

3)需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得    不现实。

角色构成

抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类

装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口

具体装饰角色(ConcreteDecorator):负责给构件对象“贴上”附加的责任

结构图

设计模式 - 装饰模式_第1张图片

代码

 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)是一种结构型设计模式,它允许在不改变现有对象结构的情况下,动态地将新功能添加到对象中。

在装饰模式中,有四个主要角色:

  1. 抽象组件(Component):定义了被装饰对象的接口,可以是抽象类或接口。

  2. 具体组件(ConcreteComponent):实现了抽象组件的接口,是被装饰的对象。

  3. 抽象装饰器(Decorator):继承或实现抽象组件,并持有一个抽象组件的引用,以便可以对被装饰对象进行装饰。

  4. 具体装饰器(ConcreteDecorator):实现抽象装饰器的接口,负责给被装饰对象添加新的功能。

装饰模式的工作原理如下:

  1. 客户端创建一个具体组件对象,并用抽象组件类型的变量引用它。

  2. 客户端可以选择创建一个或多个具体装饰器对象,并用抽象装饰器类型的变量引用它们。

  3. 客户端将具体组件对象作为参数传递给具体装饰器对象的构造函数,以便将装饰器与组件关联起来。

  4. 客户端使用装饰器对象调用方法,从而在不改变组件接口的情况下,动态地添加新的功能。

装饰模式的优点包括:

  1. 装饰模式遵循开闭原则,允许在不修改已有代码的情况下,动态地添加新的功能。

  2. 装饰模式将每个功能单独封装在具体装饰器中,使得每个装饰器的职责清晰明确,易于理解和维护。

  3. 装饰模式允许多个装饰器同时装饰一个对象,从而提供了灵活性和可组合性。

  4. 装饰模式避免了使用继承来扩展功能的问题,避免了类爆炸的情况。

装饰模式的缺点包括:

  1. 装饰模式增加了许多具体装饰器类和抽象装饰器类,增加了系统的复杂性。

  2. 装饰模式会导致装饰链的嵌套,使得调试和定位问题变得困难。

总结起来,装饰模式是一种灵活且可扩展的设计模式,它通过将功能封装在装饰器中,实现了动态地添加新功能而不改变现有对象结构的目的。

特点

装饰模式是一种结构型设计模式,它允许你在不改变现有对象结构的情况下,动态地向对象添加新的功能。装饰模式通过创建一系列装饰器来包装原始对象,从而在不修改原始对象的情况下为其添加功能。以下是装饰模式的特点和多个维度的解释:

透明性: 装饰模式可以使装饰器和原始对象具有相同的接口,从而使客户端不需要知道装饰器的存在。这种透明性使得客户端代码可以无缝地使用装饰后的对象,就像使用原始对象一样。

多层嵌套: 装饰模式允许在一个对象上嵌套多个装饰器,从而实现多个功能的组合。每个装饰器可以添加独特的行为,形成一个功能堆叠。

单一职责原则: 装饰模式遵循单一职责原则,因为每个具体的装饰器只关注一个特定的功能,从而保持了类的简单性和可维护性。

灵活性: 装饰模式提供了一种动态添加功能的方法,而不需要修改已有代码。这使得您可以在运行时根据需要选择不同的装饰器,以满足特定的要求。

解耦: 装饰模式可以将功能的添加与核心业务逻辑分离开来,从而减少了原始对象类的复杂性。这样一来,您可以专注于核心逻辑而不必担心各种功能的交织。

继承和组合: 装饰模式通过组合取代了传统的继承扩展。它允许您在运行时选择添加功能,而不是在编译时决定继承的结构。

代码重用: 装饰模式可以促进代码重用,因为您可以将不同的装饰器应用于不同的对象,从而共享一些相似的功能。

易于扩展: 当需要添加新的功能时,您可以创建新的装饰器而不必修改已有的代码。这使得系统更具扩展性。

可组合性: 您可以将多个装饰器按照需要组合在一起,形成复杂的功能组合,而不必担心功能之间的冲突。

总之,装饰模式是一种强大的设计模式,可以在不改变已有代码的情况下为对象添加新的功能。它提供了灵活性、可扩展性和解耦的优势,使得您的代码更具适应性和可维护性。

你可能感兴趣的:(设计模式,装饰模式,设计模式)