说实话,对于装饰,我根本没理解到什么程度,就像课件中说的房子都还没着落,谈什么装修和粉饰啊。一堵粗糙的墙,刷上白白地粉,再贴上几张壁画,整个一焕然一新,多美的事啊。说的容易对我来说还很难,我只能根据课件,随便看看了。
装饰模式
装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
举例来说: 现实生活中,U盘、MP3播放器、手机等具有USB接口的电子产品一般具有USB最基本的功能,那就是数据传输----写数据和读数据,因此,抽象出一个接口:
// USB接口
public interface IUSB
{
// 读数据
void ReadData();
// 写数据
void WriteData();
}
分别让U盘和MP3播放器来实现数据传输功能:
// U盘
public class UDisk:IUSB
{
#region IUSB 成员
public void ReadData()
{
Console.WriteLine("U盘读数据.....");
}
public void WriteData()
{
Console.WriteLine("U盘写数据....");
}
#endregion
}
public class MP3Player:IUSB
{
#region IUSB 成员
public void ReadData()
{
Console.WriteLine("Mp3播放器读数据.....");
}
public void WriteData()
{
Console.WriteLine("Mp3播放器写数据....");
}
#endregion
}
// 装饰者
public class Decorator:IUSB
{
private IUSB usb;
public Decorator(IUSB usb)
{
this.usb = usb;
}
#region IUSB 成员
public virtual void ReadData() //其实执行的是IUSB的ReadData
{
usb.ReadData();
}
public virtual void WriteData() //其实执行的是IUSB的WriteData
{
usb.WriteData();
}
#endregion
}
这里装饰者Decorator与IUSB之间的关系满足is – a关系,即Decorator is-a IUSB,即子类一定是父类,而父类不一定是子类。
装饰模式是为已有的功能动态地添加更多功能的一种方式。
当系统需要新功能的时候,若向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式切提供了一个非常好的解决方案,他把每个要装饰的功能都放在单独的类中,并让这个类包装他所要装饰的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行时更具需要有选择地、顺序地使用装饰功能包装对象了。