模式扩展类而不修改它们(或了解实现细节)(c#)

时间:2012-09-05 05:26:32

标签: c# .net design-patterns inheritance

我正在修改位于两个已建立图层之间的一些代码,并且无法确定最佳设计是什么。

目前,代码调用文件访问库,并将对象返回给调用者。我需要扩展返回的对象以添加一些自定义配置功能。我无权访问传递的对象的定义(例如,有些是文件流)

如果我可以创建一个行为类似于基本实例的子实例,并且可以从基本实例创建,但它有一些隐藏的额外功能,这将为我节省很多工作。这可以在不知道基类的实现细节的情况下完成吗?

代码形式看起来很像这样:

private class FileObjectWithDispose : FileObject, IDisposable
{//voidaction is a delegate, this is .net 2.0
    private VoidAction _disposeCallback;

public static FileObjectWithDispose wrapFile(FileObject unWrappedFile, VoidAction DisposeAction)
{//Implementation missing, this is the crux of what I don't know how to do
    FileObjectWithDispose wrappedFile = new FileObjectWithDispose(unWrappedFile);
    wrappedFile._disposeCallback = DisposeAction;
    return wrappedFile;
}

private FileObjectWithDispose()
    : base(null, null)//base class does not have a default constructor
{
    throw new NotImplementedException("FileObjectWithDispose is a wrapper class which is intended only to be cast from a filestream.");
}

private void Dispose()
{
    _disposeCallback();
    base.Dispose();
}

}

示例调用如下所示:

Connect(file, username, password, domain);
return FileObjectWithDispose.wrapFile(OpenFile(path), () => { Disconnect(file, username); });

我遇到的主要困难是,如果可能的话,如果基类没有实现允许自己装饰的接口,我如何获取基类实例并创建一个装饰实例? 任何想法如何完成这项任务?

谢谢!

2 个答案:

答案 0 :(得分:4)

装饰者模式是要走的路。

  1. 创建界面ICustomDisposeAction(示例名称)
  2. 使用您想要执行DisposeAction的所有可能类来实现此接口。

    FileObjectWithDispose:FileObject,IDisposable,ICustomDisposeAction

  3. 创建另一个类Decorator,它也实现了ICustomDisposeAction。通过装饰器的构造函数传递原始基类,然后在其上调用装饰器的DisposeAction

  4. public class Decorator : ICustomDisposeAction
    {
      public FileObject wrappedFile { get; set; } 
      public Decorator(FileObject unWrappedFile,...)
      {
        wrappedFile = unWrappedFile;
        //Do your custom dispose here
      }
    } 
    
    1. 在需要自定义处理对象的方式的情况下,创建装饰器对象并进行自定义处理!
    2. 希望这有帮助。

答案 1 :(得分:2)

尝试使用Decorator模式。 This链接可以提供帮助。