装饰器模式是否是在这种情况下使用的正确模式

时间:2018-02-25 04:23:37

标签: oop design-patterns decorator

我想问一下装饰模式是否符合我的需求,是另一种让我的软件设计更好的方法吗?

以前我有一个永远在线的设备。在下面的代码中,这是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#中编写它以便能够更清楚地显示问题。

1 个答案:

答案 0 :(得分:0)

由于您没有动态添加责任,

Decorator无法实现此目的。对我来说,你需要做的是拦截请求并在实际调用之前和之后执行on()off()方法。为此目的,编写一个Proxy包装底层实例并在那里进行拦截,同时保留原始类型。