设计模式之装饰模式(Decorator)
装饰模式是指对象在运行的过程中不断的增加对象,不断的增加功能,而不改变原来对象,只是将对象进行多一层的封装,这个原来类留有接口与
这个新的类进行连接,下面我们来假设有一个基类来做继承的角色类,这里大家都会想到使用抽象类来给子类提供方法,然后通过继承来实现
然后初始化定义他有五件装备
1 namespace 装饰模式
2 {
3 /// <summary>
4 /// 裸装法师
5 /// </summary>
6 public class Mage : BaseCharacter
7 {
8 public override void Show()
9 {
10 Console.WriteLine("我是裸装猩红女巫,下面开始我打装备的过程....");
11 }
12 }
13
14 /// <summary>
15 /// 戴头盔的法师
16 /// </summary>
17 public class MageWithHelmet : BaseCharacter
18 {
19 public override void Show()
20 {
21 Console.WriteLine("我是猩红女巫,下面开始我打装备的过程....");
22 Console.WriteLine("我获得了一个海盗船长的头盔....");
23 }
24
25 }
26
27 /// <summary>
28 /// 戴肩甲的法师
29 /// </summary>
30 public class MageWithShoulder : BaseCharacter
31 {
32 public override void Show()
33 {
34 Console.WriteLine("我是猩红女巫,下面开始我打装备的过程....");
35 Console.WriteLine("我获得了一个肩甲....");
36 }
37 }
38 }
通过继承的方式,来完成给原来的类添加新功能,这里如果我们假设,在这五个功能里,我不仅只能添加一个功能,也可以组合添加几个功能
例如我一次性要添加头盔和肩膀,这时我们就继续的创建子类,假设我们只有5个装备类,我们的装备方案有多种组合,就可以演变出2的5次方,32个子类。如果手动去写,那将是庞大的工作
这时候我们的装饰模式就可以不用写那么多子类就解决这个问题。
实现思路就是先创建一个装饰基类,然后再建立一个头盔装饰类,将第一个基类进行一层封装,在调用时先调用父类的接口,再调自己接口,这样做的前题是所有装饰类都要继承同一个基类下面,下面上代码,这是第一层
1 /// <summary>
2 /// 装饰基类
3 /// </summary>
4 public class BaseDecorator:BaseCharacter
5 {
6 private BaseCharacter _BaseCharacter = null;
7
8 public BaseDecorator(BaseCharacter character)
9 {
10 this._BaseCharacter = character;
11 }
12
13 public override void Show()
14 {
15 this._BaseCharacter.Show();
16 }
17 }
这里是第二层
/// <summary>
/// 头盔装饰器
/// </summary>
public class DecoratorHelmet : BaseDecorator
{
private BaseCharacter _BaseCharacter = null;
public DecoratorHelmet(BaseCharacter character) : base(character)
{
this._BaseCharacter = character;
}
public override void Show()
{
this._BaseCharacter.Show();
Console.WriteLine("我获取到一个银鳞头盔");
}
}
首先基类继承了角色基类,然后头盔装饰类继承于装饰基类,然后通过构造的方法指定了上一层方法的内存地址,输出的时候先调用了父类的内存地址指向的方法,
再调用自身的方法。对父类进行了封装,依次类推,后面要加什么功能,只要在在使用装饰头盔这样来实现封装即可。
这样你想要他组合什么功能,只需要动态的去生成,这里从原来的32个子类才能实现的多种组合,
这里只需要五个子类就能完成(也就是说通过继承的方式其实改变了原来的代码,在设计模式原则是,多使用组合,少使用继承)
这里注意一点就是,这些类都必须继承于同一个基类。装饰模式适用于不想改变原文件,而可以动态扩展新功能的场景