我有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方法中的相关任务。这就是我想到装饰模式的原因。
答案 0 :(得分:2)
答案 1 :(得分:0)
取决于这些方法正在做什么,因此解决方案可能会有所不同。 但是,如果这些方法在某种程度上并没有在某种程度上相互关联,我会建议通过像
这样的接口来抽象每个方法。 interface ILogicBAware
{
void DoB();
}
interface ILogicCAware
{
void DoC();
}
interface IAllMethods : ILogicBAware, ILogicCAware
{
void DoAll();
}
通过这种方式,您可以获得更大的灵活性和更少的耦合。通过这种方式,您可以继续前进并决定如何封装实际逻辑。但是,这又取决于你提供的课程和方法的内幕......
答案 2 :(得分:0)
这将有效但不是引入包含所有方法的全知的接口和基本实现类(因此了解整个方法集合),您还可以采用更细粒度的方法并只创建一个接口和每个方法的基础实现。这将是更具可扩展性的,如果你正确地设置它,你可以像插件一样简单地附加它们。
答案 3 :(得分:0)
您可以为每个单独的方法和每个接口的默认实现定义一个接口,并使您的类只实现所需的接口,并通过构造函数进行参数化,并使用默认实现进行装饰。