[IT168 技术文档]定义:Decorator patterns attach additional responsibilities abilities(我自己加的) to an object dynamically, decorators provide a flexible alternative to subclassing for extending functionality.
背景介绍:学习是人类与生俱来的一种能力。当然像哭泣、微笑、吃饭、睡觉等能力人一来到这个世界就会。当你学习了一种技能你就会多一种行为能力。用不同的技能把自己武装起来,你就会成为一个”多才多艺”的人,^_^。就我自己而言,吃喝拉撒睡这些就不用再提了,小学四年纪的时候学会了游泳(在同伴当中应该算是学的很晚的),大约六年级的时候开始摸篮球,算起球龄来也差不多15年了,不能算高手中的低手至少也应该算是低手中的高手了(大学的时候也是靠球技迷倒一片的,^_^。稍微自恋一下)。大学修的计算机科学与技术,毕业来北京混饭吃做了一年多的开发。后来走投无路做了一年测试,最后还是脱离了枯燥的测试工作重新做开发。算起来这几项能力我也算都具备了,现在除了做好自己的开发工作,我也会协助同事做一些测试的工作,工作之余我会参加一些游泳,篮球的比赛活动,业余时间教我老婆这几项技能,^_^。这篇文章的例子正是模拟人与技能之间的这种关系,我的一个朋友一直做开发,现在正在学习游泳,基本不会打球,这个例子把他拉进来吧!^_^。
VS自动生成的类图:
VS自动生成的类图看起来还真不大习惯,下次可能用PD了。^_^。
实例代码:
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace DecoratorDemo
6{
7 /**//// <summary>
8 /// Both subject and decorator all implment this interface.
9 /// </summary>
10 public interface IHuman
11 {
12 void Learn();
13 }
14
15 /**//// <summary>
16 /// Decorator base class, all concrete decorator classes implement this interface.
17 /// We create this class in order to make the hierarchy more clear.
18 /// </summary>
19 public interface SkillBase : IHuman
20 {
21
22 }
23
24 /**//// <summary>
25 /// Concrete subject to decorate.
26 /// </summary>
27 public sealed class ConcreteHuman : IHuman
28 {
29 public void Learn()
30 {
31 Console.WriteLine("Crying, laughing, eating,etc. are our natural skills!");
32 }
33 }
34
35
36 public sealed class TestingSkill : SkillBase
37 {
38 IHuman _human;
39 public TestingSkill(IHuman human)
40 {
41 _human = human;
42 }
43
44 public void Learn()
45 {
46 _human.Learn();
47 Console.WriteLine("I have been a tester for more than one year,i know what kinds of skills one tester should have.");
48 }
49
50 }
51 public sealed class DevelopingSkill : SkillBase
52 {
53 IHuman _human;
54 public DevelopingSkill(IHuman human)
55 {
56 _human = human;
57 }
58
59 public void Learn()
60 {
61 _human.Learn();
62 Console.WriteLine("After my graduation, I became a prefessional developer.");
63 }
64 }
65
66 public sealed class SwimmingSkill : SkillBase
67 {
68 IHuman _human;
69 public SwimmingSkill(IHuman human)
70 {
71 _human = human;
72 }
73
74 public void Learn()
75 {
76 _human.Learn();
77 Console.WriteLine("I mastered swimming skill when i was in my primary school.");
78 }
79 }
80
81 public sealed class BasketballSkill : SkillBase
82 {
83 IHuman _human;
84 public BasketballSkill(IHuman human)
85 {
86 _human = human;
87 }
88
89 public void Learn()
90 {
91 _human.Learn();
92 Console.WriteLine("More than 15 years basketball playing experience.");
93 }
94 }
95
96 /**//// <summary>
97 /// Testing driver.
98 /// </summary>
99 class Program
100 {
101 static void Main(string[] args)
102 {
103 Console.WriteLine("Do you want to have my information? Take a look at the lines below:");
104 Console.WriteLine("***********************************************************");
105 IHuman myself = new ConcreteHuman();
106 myself = new DevelopingSkill(myself);
107 myself = new TestingSkill(myself);
108 myself = new SwimmingSkill(myself);
109 myself = new BasketballSkill(myself);
110 myself.Learn();
111
112 Console.WriteLine("***********************************************************");
113 Console.WriteLine(Environment.NewLine);
114 Console.WriteLine("The following is the information of my friend.");
115 Console.WriteLine("***********************************************************");
116
117 IHuman myFriend = new ConcreteHuman();
118 myFriend = new DevelopingSkill(myFriend);
119 myFriend = new SwimmingSkill(myFriend);
120 myFriend.Learn();
121 Console.WriteLine("***********************************************************");
122
123 Console.ReadKey();
124 }
125 }
126}
127
从”用不同技能武装自己”看装饰模式
查看代码
0
相关文章