问题:
由于过多使用继承来扩展对象的功能。
举例:
给游戏写一种类型的tank,想让他实现红外线和水陆两栖的功能。
IA:红外线,IB:水,IC:陆。
由上述的例子可以看出来,如果T50Tank想要获得红外线和水陆两栖的功能,就要继承4个父类,这就导致了由于过多使用继承来扩展对象的功能,所以采用装饰模式来对代码进行修改。
思想:
继承是静态的,我们要实现动态的。
就比如虚方法是动态方法,程序需要调用他的时候才会使用到他,而上述的坦克的例子,属于继承给写死的静态方法,我们要通过装饰模式,当需要调用的时候才出现。而不是通过继承写死。
实现动态
应用:
面向对象的设计模式一定要稳定,如果需要新增加功能就要不破坏类型封装的情况下增加功能,实现开放封闭。装饰模式是结构型设计模式的巅峰之作。实质性和AOP差不太多,而AOP应用的比较广泛,而装饰模式用的不是特别多,比如说文件流就是通过装饰器叠加的。
代码演示:
有两个变量需要拓展功能
abstract class FreeAndVIp
{
public int ID { get; set; }
public string Name { get; set; }
public abstract void Study();
}
class Free : FreeAndVIp
{
public override void Study()
{
Console.WriteLine("白天上课");
Console.WriteLine("免费学生视频回放");
}
}
class VIP: FreeAndVIp
{
public override void Study()
{
Console.WriteLine("晚上上课");
}
}
有三个拓展的功能
class ZUHEJIAJICHENGJUTI : ZUHEJIAJICHENG
{
public ZUHEJIAJICHENGJUTI(FreeAndVIp student):base(student)
{
}
public override void Study()
{
base.Study();
//增加自己的行为
Console.WriteLine("获取音频");
}
}
class ZUHEJIAJICHENGJUTIAYI : ZUHEJIAJICHENG
{
public ZUHEJIAJICHENGJUTIAYI(FreeAndVIp student):base(student)
{
}
public override void Study()
{
base.Study();
//增加自己的行为
Console.WriteLine("阿姨解答");
}
}
class ZUHEJIAJICHENGJUTILIANXI : ZUHEJIAJICHENG
{
public ZUHEJIAJICHENGJUTILIANXI(FreeAndVIp student):base(student)
{
}
public override void Study()
{
base.Study();
//增加自己的行为
Console.WriteLine("实践练习");
}
}
main函数调用,不断升级类继承里式转换思想。
static void Main(string[] args)
{
FreeAndVIp vip = new VIP()
{
ID = 1333,
Name = "VIP"
};
#region 升级
//ZUHEJIAJICHENG ZUHEJIAJICHENG = new ZUHEJIAJICHENG(vip);//升级 升级就是父类转子类 转到最上层 或者 转到父类一样的时候统一一下
//FreeAndVIp ZUHEJIAJICHENG = new ZUHEJIAJICHENG(vip);//升级
//vip.Study();
//vip = new ZUHEJIAJICHENG(vip);//可以不要 里面是空的
//ZUHEJIAJICHENGJUTI ZUHEJIAJICHENGJUTI = new ZUHEJIAJICHENGJUTI(vip);//升级
//ZUHEJIAJICHENG ZUHEJIAJICHENGJUTI = new ZUHEJIAJICHENG(vip);//升级
//FreeAndVIp ZUHEJIAJICHENGJUTI = new ZUHEJIAJICHENGJUTI(vip);//升级
#endregion
//任意扩展功能 任意调整顺序 修饰多种对象
vip = new ZUHEJIAJICHENGJUTI(vip);
vip = new ZUHEJIAJICHENGJUTIAYI(vip);
vip = new ZUHEJIAJICHENGJUTILIANXI(vip);
vip.Study();
Console.WriteLine("*****************************");
FreeAndVIp free = new Free()
{
ID = 123,
Name = "Free"
};
free = new ZUHEJIAJICHENGJUTI(free);
free = new ZUHEJIAJICHENGJUTIAYI(free);
free = new ZUHEJIAJICHENGJUTILIANXI(free);
free.Study();
}
对上述代码的解释
用一个父类去里式转换需要的子类(变量和功能)
两个变量,三个拓展功能,任意拓展,任意排序,修饰多种对象。
总结
装饰模式是由静转动、组合继承共同发展,变量、功能共同继承父类的一种设计模式。充分的展示了面对对象开发,面对抽象编程的稳定性,充分展示了对拓展开放的便捷。在不破坏类封装的情况下拓展开发。