用于从两个不同的超类继承相同类的设计模式

时间:2013-08-04 16:44:32

标签: design-patterns decorator

我知道标题不是很清楚。

我有一个名为Plot的类,有2个类继承自Plot。

class Plot
{
}

class DynamicPlot : public Plot
{
}

class StaticPlot : public Plot
{
}

我想添加一些名为PhasePlot,RPMPlot vs.的类。我也希望这些类可以是动态的或静态的。

所以,我想到的第一件事就是:

class DynamicPhasePlot : public DynamicPlot 
{
}

class DynamicRPMPlot : public DynamicPlot 
{
}

class StaticPhasePlot : public StaticPlot 
{
}

class StaticRPMPlot : public StaticPlot 
{
}

这似乎不是一个很好的解决方案。我搜索了装饰模式,但我认为它不符合我的需求。但是,我不太确定。

2 个答案:

答案 0 :(得分:1)

遗憾的是,您没有给出图表的用例(以及动态/静态的上下文或关注点)。但是,InterfaceDecoratorComposition over Inheritance (strategy pattern)适用于此处。

接口:

interface IPlot //this is optional
interface IDynamicPlot : IPlot
interface IStaticPlot : IPlot
// depending on context, the IPhasePlot can be defined as 
// IDynamicPhasePlot inherited from IDynamicPlot. Same as for static.
interface IPhasePlot : IPlot
interface IRPMPlot : IPlot
class Plot : IPlot
class DynamicPlot : IDynamicPlot
//etc

策略模式:

如果派生图与DynamicStatic有依赖关系,请使用此选项。它充当外观类。

class DynamicRPMPlot{
    IDynamicPlot dynamicPlot = new DynamicPlot(); //you can do constructor injection here
    IRPMPlot rPMPlot = new RPMPlot(); //you can do constructor injection here

    public void DoSomething(){
        dynamicPlot.DoSomething();
        // you can also migrate the implementation of RPMPlot to here,
        //if it has different cases for dynamic or static
        rPMPlot.DoSomething();
    }
}

装饰图案:

如果RPMdynamic被分开,请使用此选项。

class RPMPlot : IRPMPlot {
    RPMPlot(IPlot decorated){
        // can place null guard here
        this.decorated = decorated;
    }
    IPlot decorated;

    public void DoSomething(){
        decorated.DoSomething(); //you can change the sequence
        //implementation of rpmplot
    }
}

void ConsumePlot(){
    IPlot plot = new RPMPlot(new DynamicPlot());
    plot.DoSomething();
}

答案 1 :(得分:0)

动态或静态是绘图的行为。因此,DynamicPlot是具有动态行为的Plot,而StaticPlot是具有静态行为的Plot。可以使用StrategyPattern动态设置此行为,而不是创建新的类(如DynamicPlot或StaticPlot)。

public enum PlotBehavior
{
   None,
   Dynamic,
   Static
}

public class Plot
{
   private PlotBehavior m_Behavior;
   public Plot()
   {
   }
   public SetBehavior(PlotBehavior ieBehavior)
   {
     this.m_Behavior = ieBhavior;
   }
}

现在,我们的Plot类可以实例化并用作动态或静态图。现在,我们可以将其子类化为更具体的类,如下所示。

public PhasePlot: public Plot
{
}

public RPMPlot: public Plot
{
}

你明白了!