如果我正确理解了这个问题,你有一个像这样的抽象基类:
public abstract class DeviceService
{
public abstract void DoSomething(Device device);
}
您希望实现DeviceAService 和DeviceBService,以便它们的行为根据Device 的类型而有所不同。
多态性
最面向对象的设计是使用多态性。由于Device 已经是多态的,请将您想要不同的行为放入多态方法中,并从您的服务中调用它:
public override void DoSomething(Device device)
{
// Perhaps do something first...
device.DoThePolymorphicThing();
// Perhaps do something else after...
}
在DeviceA 和DeviceB 中以不同方式实现DoThePolymorphicThing。
开放世界
如果您无法更改Device 基类的API,并且您还需要支持DeviceA 和DeviceB 之外的其他实现,您可能需要在@ 中执行运行时检查987654334@:
public override void DoSomething(Device device)
{
if (device is DeviceA)
// Do something...
else if (device is DeviceB)
// Do something else...
else
// remember to handle the case where it's neither A nor B
}
我们可以将这种类型的场景称为“开放世界”,因为Device 对可扩展性开放。
封闭的世界
另一方面,如果您知道自己只会拥有DeviceA 和DeviceB,那么Visitor 设计模式正是您所需要的: p>
public interface IDeviceVisitor
{
void VisitA(DeviceA device);
void VisitB(DeviceB device);
}
public abstract class Device
{
public abstract void Accept(IDeviceVisitor visitor);
// Other members go here if you need them...
}
public class DeviceA : Device
{
public override void Accept(IDeviceVisitor visitor)
{
visitor.VisitA(this);
}
// Other overrides, if needed, go here...
}
// Define DeviceB in the same way...
您现在可以像这样实现服务:
public override void DoSomething(Device device)
{
// Perhaps do something first...
device.Accept(new MyDeviceVisitor());
// Perhaps do something else after...
}
您可以将此场景视为“封闭世界”场景,因为您无法在不更改访问者 API 的情况下添加第三种设备(从而破坏现有实现)。