装饰模式

定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能

例子:假设现在有个中国人要体现出他会说英文和日文,这时候怎么办?

复制代码
  public abstract class People 
    {
        public abstract void Say();
    }
    public class Chinese : People
    {
        public override void Say()
        {
            Console.WriteLine("我是中国人");
        }
    }
复制代码

如果体现说日文的话,要重新再写一个子类,如果是N个就要写N个子类,显得不合理。

改造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public abstract class People
  {
      public abstract void say();
  }
 
  public class Chinese : People
  {
      public override void say()
      {
          Console.WriteLine("我是中国人");
      }
  }
 
  public abstract class Decorator : People
  {
      public People people;
      public Decorator(People p)
      {
          this.people = p;
      }
 
      public override void say()
      {
          people.say();         
      }
  }
 
  public class English : Decorator
  {
      public English(People p) : base(p)
      {
      }
      public override void say()
      {
          base.say();
          //新的行为
          SayEnglish();
      }
 
      public void SayEnglish()
      {
          Console.WriteLine("我会讲英语");
      }
  }
 
  public class Jan : Decorator
  {
      public Jan(People p) : base(p) 
      {
      }
 
      public override void say()
      {
          base.say();
          SayJan();
      }
 
      public void SayJan()
      {
          Console.WriteLine("我会讲日文");
      }
  }

发现使用装饰模式可以减少类的实现,也可以实现代码组合:例如:

1
2
Jan j = new Jan(new English(new Chinese()));
            j.say();

English它继承了Decorator类又构造了people,我们实例化Englist也会传入一个抽象people(创建中国人的实例)进来,这样我们就可以调用Say和SayEnglish方

由此可见:装饰模式的好处:当系统需要有新的功能的时候,向旧的类添加新的代码,新加的代码往往会装饰原来类的核心职责和主要行为。

优点:有效的将类中的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。

 

1
 

 

posted @   Chin_lung  阅读(84)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示