2

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

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

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

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

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); });

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

谢谢!

4

2 回答 2

6

装饰器模式是要走的路。

  1. 创建接口ICustomDisposeAction(示例名称)
  2. 使用您希望在其上执行的所有可能的类来实现此接口DisposeAction

    FileObjectWithDispose : FileObject, IDisposable, ICustomDisposeAction

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

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

希望这可以帮助。

于 2012-09-05T13:47:09.990 回答
2

尝试使用装饰器模式。链接可以提供帮助。

于 2012-09-05T06:38:06.537 回答