装饰模式:指在不必改变原类文件和使用继承的情况下动态的扩展一个对象的功能。简单一点说,装饰模式就是动态的给一个对象添加一些额外的职责,即对一个对象进行包装,使其成为一个看着顺眼的整体。即将每个要装饰的功能放在单独的类中,而提供一个类对要装饰的类的对象进行包装。
比如新买的房子,里面什么也没有,想要住进去首先需要装修,添加家电等,这个过程整体可以称为装饰,等最后放到我们眼前的就是一个完整而美观的房子。用代码实现如下:
class House
{
//构造函数初始化
public House()
{
}
private string name;
public House(string name)
{
this.name=name;
}
//定义虚函数Show(),供子类重写
public virtual void Show()
{
console.Writeline("{0}装饰的房子",name);
}
}
class Decoration:House
{
protected House house;
//为变量house赋值
public void SetDecoration(House house)
{
this.house=house;
}
//重写函数Show()
public override void Show()
{
if(house!=null)
{
house.Show();
}
}
}
class Bed:Decoration
{
//方法Show()的重写
public override void Show()
{
console.WriteLine("床");
base.Show(); //调用父类的Show()函数
}
}
class Lamp:Decoration
{
//方法Show()的重写
public override void Show()
{
console.WriteLine("灯");
base.Show(); //调用父类的Show()函数
}
}
class TV:Decoration
{
//方法Show()的重写
public override void Show()
{
console.WriteLine("电视");
base.Show(); //调用父类的Show()函数
}
}
主函数中则是:
House se=new House("小菜");
Bedse1=new Bed();
Lampse2=new Lamp();
TVse3=new TV();
se1.SetDecoration(se);
se2.SetDecoration(se1);
se3.SetDecoration(se2);
se3.Show();
装饰功能的优点是:把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。