2013-03-08 64 views
0

假设我有两个设置(为了简单起见)改变了我的类型在可重用的库中的行为。传播行为到层次结构的正确方法

我可以定义一个配置类:

class Config { 
    public bool Behaviour1 { get; set; } 
    public bool Behaviour2 { get; set; } 
} 

比我做这样的事情,我必须从组成根(无论国际奥委会处理)整个层次传播实例。

代码将被一大堆条件语句侵入,从而降低可读性,可维护性和可扩展性。

定义两种行为类型会不会更好?

public class Behaviour1 : IBehaviour1 {} 

public class Behaviour2 : IBehaviour2 {} 

移除其他类型从Config获得的全局依赖关系。比需要行为的每个班级取决于IBehaviourX,其工厂将在Config类型的基础上注入适当的具体。

这样只有少数顶级类型将取决于配置和分配行为(原谅双关语)的行为将不会传播到整个层次。

我对这种情况下的解决方案感兴趣。

回答

1

我会说你在正确的轨道上实现你的行为作为类/接口,而不是处理与条件之类的差异。

您可能想看看Strategy Pattern,因为您目前的想法似乎正朝着这个方向前进。使用IoC你的想法应该可以正常工作,这可能是我会解决的。

+0

+1 @pmacnaughton和这个答复,因为这是最适合我的问题的模式。关于这种情况下的IoC,我会在没有框架的情况下进行。正如解释[这里](http:// stackoverflow。com/questions/14681779/locate-the-correct-composition-root-for-a-net-library)_poor-man-injection_可能适合可重用的库。 – jay 2013-03-09 07:43:55

1

你可能会想到Creation Method的设计模式。

不得不根据配置参数改变类的行为将会出现问题,因为那么您的类将清楚地违反SRP规则,创建子类并使用虚拟/覆盖方法来获取与配置相关的期望行为,使用创建方法patten获得正确的对象

+0

你是什么意思?单件或工厂或抽象方法工厂或生成器或原型!请更正您的答案。 – IamStalker 2013-03-08 07:16:05

+0

+1与样本链接,@Saurabh。不确定这种模式适合我的解决方案。你能提出一个有利于_composition而不是inheritance_的模式吗? – jay 2013-03-08 07:20:09

+1

我的理解是,您正在使用配置属性来定义/更改导致违反SRP的类的行为,当然,我建议的是移动基于配置属性转换成特定的类,然后再次重构将通用代码移动到基类中。当然,在某个时间点之后,您需要根据配置获得适当的对象,然后创建方法将会有所帮助。这是我从这个问题中了解到的。 – TalentTuner 2013-03-08 07:31:44