装饰模式作业
下面是本次作业的题目:
设计的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、摄像头)的接口(就是上面我注释的部分),然后在调用具体装饰类的时候,去前面的接口中激活需要拓展的功能;但是转念一想,想起了下面的这句话:
那么似乎我一开始的设想似乎就违背了上面的这句话。如果之前就都准备好接口了,那么何来动态拓展一说。
因此,稀里糊涂写下了上面的代码。代码中存在着不少的设计问题,希望在之后自己可以将它们体会出来。