参考:https://www.cnblogs.com/frank0812/p/11281105.html
1.什么是装饰器模式
2.装饰器模式有什么优势
3.怎么用装饰器模式
定义:装饰者顾名思义就是对一个类添加一些额外的装饰(功能)。我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法。考虑一种情况,如我们要给父类中的Show方法添加三个新功能功能a、功能b、功能c,这三种功能组合在一起时数目和执行顺序不同,效果也是不同的,为了现实所有的功能,我们需要创建很多子类,如子类1的show方法:BaseShow+功能a,子类2的show方法:BaseShow+ab,子类3的show方法:BaseShow+abc,子类4的show方法:BaseShow+ba.....子类n的show方法:BaseShow+功能cba(BaseShow指的是父类原本的show方法),如果添加的功能组合太多使用继承会造成子类爆炸。装饰器模式可以很好地解决这个问题。(举个例子:给主功能加装饰,例如你是一个裸装法师,你要三个槽,衣服,鞋子,帽子,若要列出则你需要8个子类(2*2*2),若使用装饰器模式,则只需要3个装饰器实现具体类就行)
代码如下:
using System;
namespace DecoratorModel
{
//抽象类
public abstract class BaseDecorator
{
public abstract void Show();
}
//裸装法师
public class SinglePerson : BaseDecorator
{
public override void Show()
{
Console.WriteLine("这是一个法师");
}
}
//装饰器类
public class Decorator : BaseDecorator
{
public BaseDecorator decorator = null;
public Decorator(BaseDecorator baseDecorator)
{
this.decorator = baseDecorator;
}
public override void Show()
{
this.decorator.Show();
}
}
//具体实现装饰器类
public class SinglePersonWithShoes : Decorator
{
public SinglePersonWithShoes(BaseDecorator decorator):base(decorator)
{
this.decorator = decorator;
}
public override void Show()
{
base.Show();
Console.WriteLine("穿一双鞋子");
}
}
//具体实现装饰器类
public class SinglePersonWithHit : Decorator
{
public SinglePersonWithHit(BaseDecorator decorator) : base(decorator)
{
this.decorator = decorator;
}
public override void Show()
{
base.Show();
Console.WriteLine("戴个帽子");
}
}
class Program
{
static void Main(string[] args)
{
BaseDecorator person = new SinglePerson();
person = new SinglePersonWithShoes(person);
person = new SinglePersonWithHit(person);
person.Show();
Console.ReadLine();
}
}
}
装饰者模式的使用场景:
当我们需要动态添加类的功能同时不改变类的结构时可以使用装饰者模式,装饰类本质是一个现有类的包装。
装饰者模式的优点:
1.一个类需要添加一些功能,而这些功能按数目、顺序组合形成的效果不一样,如果用继承会造成子类过多,装饰者模式可以很好地解决这个问题;
2.使用装饰者模式我们可以动态的添加/删除类的功能,灵活性好。
装饰者模式的缺点:
多层装饰比较复杂,我们需要注意装饰顺序等因素。如先穿内裤再穿裤子,是正常人;而先穿裤子再穿内裤就是超人了。在开发中先过滤字符串再加密,和先加密字符串再过滤的效果是完全不同的。