你不需要装饰器模式
装饰器模式在这种情况下不是很有用。其目的是让您在运行时附加行为。您正在尝试在编译时(或多或少)附加行为。
见:http://en.wikipedia.org/wiki/Decorator_pattern
此模式允许用户创建这些类型的代码实例:
- 故意未修饰的类型,仅具有基本行为
- 允许您提供覆盖行为的任意修饰类型
为此,会产生大量设计开销。只有一个装饰,你需要实现四个类。
如果您不关心实例化故意未修饰的类型,这将是很多开销。
你可能根本不需要担心这个
如果您已经推出了一个界面,我只会担心这种情况,并且一次重新部署所有内容(客户端和服务)的成本很高。如果您有幸一次为所有用户重新部署整个世界,只需修改界面即可。
多个接口更适合您的场景
如果您只是想在交错部署时保持服务和客户端运行,我建议您利用 .Net 允许接口多重继承这一事实,并对接口进行版本控制。
发布修改接口的新版本时,添加新接口并实现两者。让您的对象实现这两个接口。
这将允许您错开部署并保持向后兼容。您可以在最适合您的日程安排的任何时间弃用和删除旧界面。
这是一个例子。请注意,我根本没有考虑服务的设计,除了解决您的具体问题:
namespace Version1
{
public interface IOpenDefectService
{
void Submit(string title, string description, int severity);
void Bump(int issueId);
}
}
namespace Version2
{
public interface IOpenDefectService
{
void Submit(string title, string description, int severity);
// Removed Bump method - it was a bad idea
// Added an optional priority field
void Submit(string title, string description, int severity,
int priority);
// Added support for deleting
void Delete(int id);
}
}
public class OpenDefectService : Version1.IOpenDefectService,
Version2.IOpenDefectService
{
// Still must support it until you no longer have any clients using it.
// Here to support staggered rollouts
[Obsolete("This method is deprecated. Don't use it")]
public void Bump(int issueId) { /* Still has implementation... */ }
public void Submit(string title, string description,
int severity) { /* ... */ }
public void Submit(string title, string description,
int severity, int priority) { /* ... */ }
public void Delete(int id) { /* ... */ }
}