我想问一下装饰模式是否符合我的需求,是另一种让我的软件设计更好的方法吗?
以前我有一个永远在线的设备。在下面的代码中,这是Device类。现在,为了节省一些电池寿命,我需要将其关闭然后再打开。我创建了一个DeviceWithOnOffDecorator类。我使用了装饰模式,我认为它避免了对Device类的修改。但是在每次操作时都有On和Off,我觉得代码不符合DRY原则。
namespace Decorator
{
interface IDevice
{
byte[] GetData();
void SendData();
}
class Device : IDevice
{
public byte[] GetData() {return new byte[] {1,2,3 }; }
public void SendData() {Console.WriteLine("Sending Data"); }
}
// new requirement, the device needs to be turned on and turned off
// after each operation to save some Battery Power
class DeviceWithOnOffDecorator:IDevice
{
IDevice mIdevice;
public DeviceWithOnOffDecorator(IDevice d)
{
this.mIdevice = d;
Off();
}
void Off() { Console.WriteLine("Off");}
void On() { Console.WriteLine("On"); }
public byte[] GetData()
{
On();
var b = mIdevice.GetData();
Off();
return b;
}
public void SendData()
{
On();
mIdevice.SendData();
Off();
}
}
class Program
{
static void Main(string[] args)
{
Device device = new Device();
DeviceWithOnOffDecorator devicewithOnOff = new DeviceWithOnOffDecorator(device);
IDevice iDevice = devicewithOnOff;
var data = iDevice.GetData();
iDevice.SendData();
}
}
}
在这个例子中:我只有两个操作 GetData 和 SendData ,但在实际软件上涉及大量操作,我需要将每个操作都包含在内打开和关闭,
void AnotherOperation1()
{
On();
// do all stuffs here
Off();
}
byte AnotherOperation2()
{
On();
byte b;
// do all stuffs here
Off();
return b;
}
我觉得用On和Off包含每个函数是重复的,有没有办法改善这个?
编辑:此外,原始代码是用C ++编写的。我只是在C#中编写它以便能够更清楚地显示问题。
答案 0 :(得分:0)
Decorator
无法实现此目的。对我来说,你需要做的是拦截请求并在实际调用之前和之后执行on()
和off()
方法。为此目的,编写一个Proxy
包装底层实例并在那里进行拦截,同时保留原始类型。