【发布时间】:2011-08-08 14:57:09
【问题描述】:
我有 3 个课程:
class First {
public void SetA(){ ... }
public void SetB(){ ... }
public void SetC(){ ... }
public void SetD(){ ... }
public void SetZ(){ ... }
}
class Second {
public void SetC(){ ... }
public void SetD(){ ... }
public void SetE(){ ... }
public void SetF(){ ... }
public void SetX(){ ... }
}
class Third{
public void SetA(){ ... }
public void SetB(){ ... }
public void SetE(){ ... }
public void SetF(){ ... }
public void SetY(){ ... }
}
如您所见,我使用相同的方法复制代码。
昨天我意识到有时我想在每个方法中添加另一个推荐。
所以我正在寻找一种方法来解决这两个问题。我想到的一种解决方案是:
-
创建接口:
interface IAllMethods { void SetA(); void SetB(); void SetC(); void SetD(); void SetE(); void SetF(); void SetX(); void SetY(); void SetZ(); } -
创建默认实现:
class DefaultAllMethods { public void SetA(){ ... } public void SetB(){ ... } public void SetC(){ ... } public void SetD(){ ... } public void SetE(){ ... } public void SetF(){ ... } public void SetX(){ ... } public void SetY(){ ... } public void SetZ(){ ... } } -
使用装饰器模式创建另一个实现以添加额外的命令:
class ExtraAllMethods { private IAllMethods _allMethods; public ExtraAllMethods (IAllMethods allMethods) { _allMethods=allMethods; } public void SetA(){ _allMethods.SetA(); extraMethod(); } public void SetB(){ _allMethods.SetB(); extraMethod(); } public void SetC(){ _allMethods.SetC(); extraMethod(); } .. .. .. } -
在 First、Second 和 Third 类中使用期望实现。例如:
class Third{ private IAllMethods _allMethods; public Third(IAllMethods allMethods) { _allMethods=allMethods; } public void SetA(){ _allMethods.SetA(); } public void SetB(){ _allMethods.SetB(); } .. .. .. }
您如何看待这个解决方案?有没有更好的设计来满足这个需求?
更新
人们要求真正的业务,所以这里是:
我有 3 种传输类型:TransmissionA、TransmissionB、TransmissionC
每个传输都有许多参数(成员或属性)。例如,TransmissionA 有 WorkerId、CustomerId、MessageName 等。 TransmissionB 有 WorkerId 和 MessageName 但没有 CustomerId。 TransmissionC 有 WorkerId、CustomerId 但没有 MessageName。这些只是示例 - 在我的情况下,每个传输都有更多属性。每个属性都有 Set 方法。
现在有一个新的需求。在系统的某处有一个名为“更新任务”的选项。如果该选项为 ON,那么我需要在每个 Set 方法中更新相关任务。这就是我想到装饰器模式的原因。
【问题讨论】:
-
你为什么使用方法而不是设置属性?
-
只需声明一个带有方法的抽象类并继承该类。然后,您可以简单地覆盖该方法。如果该类不使用它,则不要调用它或覆盖它。
-
这些类实际上可以互换吗?换句话说,它是否像狗和猫一样,虽然不同,但既能走路又能咬人?我试图确切地了解它们的作用以及它们之间的关系。
-
@Armen Tsirunyan - 我认为这些方法确实有所作为。我同意这是一个糟糕的设计。
-
如果您解释您要解决的问题,而不是给出抽象并询问“如何使其更抽象”,这将有所帮助。它使我们能够跳出框框思考。
标签: c# .net design-patterns architecture