装饰模式理解

装饰模式理解
什么是装饰模式
根据大话设计模式一书中给出的定义
装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
解释了什么是装饰模式,现在来说一下为什么需要装饰模式。
首先就是它直接将类的核心功能与职责进行拆分,避免了将核心类因为后期需求的变动导致核心类代码量一直增加从而导致类越来越臃肿,后续难以维护。
功能设计之初无法完全预料到后续变动,将类的拆分符合高内聚低耦合的设计要求。
先列出不适用装饰模式,类的写法。


如上图所示,如果功能增加就会导致Person类频繁变动。
如果使用了装饰模式效果如何,这里我没有使用书中的实例而是另外撰写的,以加深理解。

/// <summary>
/// 抽象类,即装饰者模式中的抽象组件类
/// </summary>
public abstract class Phone
{
public abstract void Print();
}
/// <summary>
/// 装饰模式中的具体组件类
/// </summary>
public class ApplePhone : Phone
{
public override void Print()
{
Console.WriteLine("具体执行对象手机");
}
}

/// <summary>
/// 装饰抽象类,要让装饰完全取代抽象组件
/// </summary>
public abstract class Decorator : Phone
{
private Phone Phone;

public Decorator(Phone phone)
{
Phone = phone;
}

public override void Print()
{
if (Phone != null)
Phone.Print();
}
}

/// <summary>
/// 具体装饰者
/// </summary>
public class Sticker : Decorator
{
public Sticker(Phone phone) : base(phone)
{
}
public override void Print()
{
base.Print();
//添加自定义行为
AddSticker();
}
public void AddSticker()
{
Console.WriteLine("手机已经贴膜了");
}
}

public class Shell : Decorator
{
public Shell(Phone phone) : base(phone)
{ }
public override void Print()
{
base.Print();
//添加自定义行为
AddShell();
}
public void AddShell()
{
Console.WriteLine("手机已经装壳了");
}
}

public class Battery : Decorator
{
public Battery(Phone phone) : base(phone)
{ }
public override void Print()
{
base.Print();
//添加自定义行为
AddBattery();
}
public void AddBattery()
{
Console.WriteLine("手机加装电池");
}
}
View Code

 


控制台中调用

static void Main(string[] args)
{
ApplePhone applePhone = new ApplePhone();
Sticker sticker = new Sticker(applePhone);
Shell shell = new Shell(sticker);
Battery battery = new Battery(shell);
battery.Print();
Console.ReadLine();
}
View Code

 


显示结果如下:


核心就是可以随意对核心抽象类添加自定义功能,每次添加新功能时要把上次实现的类传入到新的功能类中,在调用核心功能时因为Base.Print的存在会
调用父级的方法,如果父级还有父级就再继续往上走,直到完成。

  • 抽象构件:给出一个抽象接口,以规范准备接受附加责任的对象。
  • 具体构件:定义一个将要接收附加责任的类。
  • 装饰(Dicorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰:负责给构件对象 ”贴上“附加的责任。

何时使用装饰模式
因为书中总结的已经鞭辟入里,我套用书中的解释
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,当系统需要新功能的时候,是向旧的类中添加新的代码。但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度.
而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了
装饰模式的优点我总结下来就是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类。是的,这样做更大的好处就是有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑
以上就是我的简单梳理。

posted @ 2022-02-14 13:29  眯着  阅读(75)  评论(0)    收藏  举报