装饰模式作业

 下面是本次作业的题目:

 

设计的UML类图:

  

 

下面是主要的代码:

    

 1 /// <summary>
 2     /// 抽象组件类
 3     /// </summary>
 4      public abstract class MobilePhone
 5      {
 6          public MobilePhone()
 7          { }
 8 
 9          //private string _Location;                     //存储将来需要拓展的定位数据
10 
11          public abstract void SendMessage();  //发送短信
12          public abstract void Call();         //打电话
13 
14          //public abstract void Connect();  //将来需要拓展的Bluetooth功能
15      }
 1   /// <summary>
 2     /// 具体组件类 ApplePhone
 3     /// </summary>
 4     public class ApplePhone:MobilePhone
 5     {
 6         public ApplePhone()
 7         { }
 8 
 9         public override void SendMessage()
10         {
11             Console.WriteLine("ApplePhone 现在已经具备了发送短信的功能");
12         }
13 
14         public override void Call()
15         {
16             Console.WriteLine("ApplePhone 现在已经具备了普通通信的功能");
17         }
18 
19         //public override void Connect()
20         //{
21         //    Console.WriteLine("ApplePhone 现在已经拓展了蓝牙功能,正在连接....");
22         //}
23     }
24 
25 /// <summary>
26     /// 具体组件类 MiPhone
27     /// </summary>
28     public class MiPhone:MobilePhone
29     {
30         public MiPhone()
31         { }
32 
33         public override void SendMessage()
34         {
35             Console.WriteLine("MiPhone 现在已经具备了发送短信的功能");
36         }
37 
38         public override void Call()
39         {
40             Console.WriteLine("MiPhone 现在已经具备了普通通信的功能");
41         }
42 
43         //public override void Connect()
44         //{
45         //    Console.WriteLine("MiPhone 现在已经拓展了蓝牙功能,正在连接....");
46         //}
47     }
 1 /// <summary>
 2     /// 抽象装饰类 Function
 3     /// </summary>
 4     public class Function:MobilePhone
 5     {
 6         private MobilePhone _mobilephone;
 7 
 8         public Function(MobilePhone mobilephone)
 9         {
10             _mobilephone = mobilephone;
11         }
12 
13         public override void SendMessage()
14         {
15             _mobilephone.SendMessage();
16         }
17 
18         public override void Call()
19         {
20             _mobilephone.Call();
21         }
22 
23         //public override void Connect()
24         //{
25         //    _mobilephone.Connect();
26         //}
27     }
 1  /// <summary>
 2     /// 具体装饰类 Bluetooth
 3     /// </summary>
 4     public class Bluetooth:Function
 5     {
 6         public Bluetooth(MobilePhone mobilephone)
 7             : base(mobilephone)
 8         {
 9             Console.WriteLine("请您稍等,系统现在正在安装蓝牙功能");
10             Console.WriteLine("蓝牙功能添加成功");
11         }
12 
13         //public override void Connect()
14         //{
15         //    Console.WriteLine("请您稍等,系统现在正在安装蓝牙功能");
16         //    base.Connect();
17         //}
18 
19         public void Connect()
20         {
21             Console.WriteLine("蓝牙正在连接");
22         }
23     }
 1 /// <summary>
 2     /// 具体装饰类 GPS
 3     /// </summary>
 4     public class GPS:Function
 5     {
 6         public string Localtion { get; set; }
 7         
 8         public GPS(MobilePhone mobilephone)
 9             : base(mobilephone)
10         {
11             
12         }
13     }
 1 /// <summary>
 2     /// 具体装饰类 Camera
 3     /// </summary>
 4     public class Camera:Function
 5     {
 6         public Camera(MobilePhone mobilephone)
 7             : base(mobilephone)
 8         {
 9             Console.WriteLine("请您稍等,系统现在正在安装摄像头功能");
10             Console.WriteLine("摄像头功能添加成功");
11         }
12 
13         //public override void Connect()
14         //{
15         //    Console.WriteLine("请您稍等,系统现在正在安装蓝牙功能");
16         //    base.Connect();
17         //}
18 
19         public override void Call()
20         {
21             Console.WriteLine("通信功能升级为带有视频");
22         }
23     }
 1         /// <summary>
 2         /// 客户端代码
 3         /// </summary>
 4         /// <param name="args"></param>
 5         static void Main(string[] args)
 6         {
 7             MobilePhone mobilephone = new ApplePhone();
 8             mobilephone.SendMessage();
 9             mobilephone.Call();
10 
11             Bluetooth bluetooth = new Bluetooth(mobilephone);
12             bluetooth.Connect();
13 
14             GPS gps = new GPS(bluetooth);
15             gps.Localtion = "(3,4)";
16 
17             Camera camera = new Camera(gps);
18 
19             camera.Call();
20 
21             Console.ReadLine();
22 
23         }

 

结果如下图所示:

   

 

心得体会:

   感觉自己对于装饰模式的体会仍然停留在较为片面的阶段,依然无法深入的去理解他,希望慢慢体会,也许将来有一天就悟出来了,哈哈。

   打个比方,就在自己写代码的时候,一开始我设想: 先在 MobliePhone 这个抽象组件类中 留下将来需要拓展的功能(蓝牙、Gps、摄像头)的接口(就是上面我注释的部分),然后在调用具体装饰类的时候,去前面的接口中激活需要拓展的功能;但是转念一想,想起了下面的这句话:

                               

  那么似乎我一开始的设想似乎就违背了上面的这句话。如果之前就都准备好接口了,那么何来动态拓展一说。

  因此,稀里糊涂写下了上面的代码。代码中存在着不少的设计问题,希望在之后自己可以将它们体会出来。

posted @ 2015-12-30 14:52  菠萝队长  阅读(229)  评论(0编辑  收藏  举报