我想为家庭自动化项目找到最佳的设计解决方案。
我有以下实体:
//Switch light on/off
ISwitchable
{
Switch()
}
IDevice
{
}
Lamp : IDevice, ISwitchable
{
Switch()
}
如果我收到用户的输入以打开灯,我想调用以下命令:
Lamp.Switch(...)
开关是字符串输入。
我将使用工厂方法来选择特定的设备(灯),但是特定的功能呢?
什么是调用欲望方法的最佳实践解决方案(如果存在)。 反思是必经之路,还是我可以不使用反思而思考设计? 谢谢!
答案 0 :(得分:0)
我认为您正在寻找带有strategy pattern的abstract factory来制定策略。
您描述的每个不同的“操作”都是一种策略。所有这些策略都必须实现相同的接口(可能是采用设备参数的称为Do
/ Invoke
/ Execute
之类的方法)。
为抽象工厂提供了指示所需策略的信息,并返回了该策略的具体实现(通常通过switch
)。
以一个示例为例,您将有一个由类实现的“打开”策略,并且在该策略的方法中,如果给定的设备合适(例如,如果它是ISwitchable),则可以在该方法上调用该方法。像这样的设备:
ISwitchable switchable=device as ISwitchable;
if (switchable!=null)
{
switchable.Switch();
}
在这一点上,您可以看到问题中的ISwitchable接口没有用,因为您正在尝试打开某项操作,但是它所需要使用的只是一种可以切换开关的方法(设备可能已经打开了)。但我相信您可以解决这些细节。请记住,不同的操作可能需要设备来实现其他接口。
我认为问题中的IDevice
接口是多余的-只需使用object
。当然是most interfaces with no members are worthless。每个设备实现哪个操作接口,就足够了。