创建装饰器
装饰器设计模式用于动态地为对象添加额外的行为。 此外,通过使用接口,装饰器可以像多重继承一样统一类型。
让我们举个例子——假设您有两个对象,分别叫做 鸟 和 蜥蜴 ,您希望将它们放入装饰器中:
class Bird
{
public void Fly()
{
...
}
}
class Lizard
{
public void Walk()
{
...
}
}
1. 使用提取接口重构获取对象接口
由于装饰器不能同时继承这两个类,我们可以从 重构 菜单 Control+Shift+R 中调用 提取接口重构 以获取这两个对象的接口:

调用此重构会弹出一个窗口,询问我们哪些成员应出现在接口中:

对这两个类执行此操作后,我们得到以下代码:
internal interface IBird
{
void Fly();
}
class Bird : IBird
{
public void Fly()
{
...
}
}
internal interface ILizard
{
void Walk();
}
class Lizard : ILizard
{
public void Walk()
{
...
}
}
2. 声明一个装饰器类
通过这些接口,我们可以创建一个装饰器。 首先,我们声明一个名为 龙 的类,表明它实现了 IBird 和 ILizard:
class Dragon : IBird, ILizard
{
...
}
现在是聚合成员。 最简单的方法是先将它们声明为字段,即:
class Dragon : IBird, ILizard
{
private Bird bird;
private Lizard lizard;
}
3. 使用快速修复初始化未使用的字段
现在,我们可以对未使用的字段应用 快速修复 ,并从构造函数参数中初始化它们:

完成后,我们的类将如下所示:
class Dragon : IBird, ILizard
{
private Bird bird;
private Lizard lizard;
public Dragon(Bird bird, Lizard lizard)
{
this.bird = bird;
this.lizard = lizard;
}
}
4. 为源对象生成委托成员。
现在是最后的润色——我们希望为 bird 和 lizard 生成委托成员。 这很简单——我们打开生成菜单 Alt+Insert 并选择 委托成员:

ReSharper 然后会询问我们需要委托哪些成员:

最终结果如下:
class Dragon : IBird, ILizard
{
public void Fly()
{
bird.Fly();
}
public void Walk()
{
lizard.Walk();
}
private Bird bird;
private Lizard lizard;
public Dragon(Bird bird, Lizard lizard)
{
this.bird = bird;
this.lizard = lizard;
}
}
就是这样! 我们的装饰器已经准备好了。
最后修改日期: 2025年 9月 27日