装饰模式使用组合而不是继承

Nei*_*ell 0 c# design-patterns decorator composition

我之前对装饰器模式的理解是你继承WindowWindowDecorator,然后在重写的方法中,在调用Window所述方法的实现之前做了一些额外的工作.类似于以下内容:

public class Window
{
    public virtual void Open()
    {
        // Open the window
    }
}

public class LockableWindow : Window // Decorator
{
    public virtual void Open()
    {
        // Unlock the window
        base.Open();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这基本上是对装饰进行硬编码,那么如何使用合成而不是继承来重构呢?

Han*_*Gay 7

对不起,我的C#有点(好的,非常)生锈,所以可能会有一些语法错误,但基本的想法是正确的.

public interface IWindow
{
    void Open();
}

public class Window : IWindow
{
    public virtual void Open()
    {
        // Open the window
    }
}

public class LockableWindow : IWindow
{
    private IWindow _wrappedWindow;

    public LockableWindow(IWindow wrappedWindow)
    {
        _wrappedWindow = wrappedWindow;
    }

    public virtual void Open()
    {
        // TODO Unlock window if necessary
        _wrappedWindow.open();
    }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的关键是新IWindow界面; 这就是允许你继续使用多态的原因.