我知道标题不是很清楚。
我有一个名为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
{
}
这似乎不是一个很好的解决方案。我搜索了装饰模式,但我认为它不符合我的需求。但是,我不太确定。
答案 0 :(得分:1)
遗憾的是,您没有给出图表的用例(以及动态/静态的上下文或关注点)。但是,Interface
,Decorator
或Composition 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
如果派生图与Dynamic
或Static
有依赖关系,请使用此选项。它充当外观类。
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();
}
}
如果RPM
和dynamic
被分开,请使用此选项。
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
{
}
你明白了!