设计模式之结构型模式二.docx
《设计模式之结构型模式二.docx》由会员分享,可在线阅读,更多相关《设计模式之结构型模式二.docx(12页珍藏版)》请在冰豆网上搜索。
设计模式之结构型模式二
设计模式之结构型模式二
结构型模式:
装饰模式:
动态地给一个对象添加一些额外的职责。
优点:
把类中的装饰功能从类中搬移出去,这样可以简化原有的类。
有效地把类的核心功能和装饰功能区分开了。
已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承
装饰模式,给一个对象动态添加额外职责,这些职责需要由用户决定加入的方式和时机。
装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。
就增加功能来说,装饰模式比生成子类更加灵活。
方法:
1,定义一个对象接口Component
2,定义一个具体的对象ConcreteComponent
3,定义一个装饰类Decorator
4,定义装饰类的具体对象ConcreteDecoratorA等
给ConcreteComponent对象添加职责
举例说明:
例如:
一幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。
装饰模式结构图:
代码如下:
[csharp] viewplaincopyprint?
1.//Component 类
2. abstract class Component
3. {
4. public abstract void Operation();
5.
6. }
7. //ConcreteComponent 类
8. class ConcreteComponent :
Component
9. {
10. public override void Operation()
11. {
12. Console.WriteLine("具体对象的操作");
13.
14. }
15. }
16. //Decorator 类
17. abstract class Decorator :
Component
18. {
19. protected Component component;
20. public void SetComponent(Component component)
21. {
22. ponent = component;
23.
24. }
25. public override void Operation()
26. {
27. if (component !
= null)
28. {
29. component.Operation();
30.
31. }
32. }
33.
34. }
35. class ConcreteDecoratorA :
Decorator
36. {
37. private string addedState;
38. public override void Operation()
39. {
40. base .Operation();
41. addedState = "new state";
42. Console.WriteLine("具体装饰对象A的操作");
43.
44. }
45. }
46. class ConcreateDecoratorB:
Decorator
47. {
48. public override void Operation()
49. {
50. base.Operation();
51. AddedBehavior();
52. Console.WriteLine("具体装饰对象B的操作");
53.
54. }
55. private void AddedBehavior()
56. {
57. }
58. }
外观模式
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子类系统更加容易使用。
外观类,它需要了解所有的子系统的方法和属性,进行组合,以备外界调用(将子类的方法和属性组合到外观类)
举例说明:
例如:
我们拨打10086,可以办理,彩铃,手机报,全时通等业务(子对象),而10086则是为子对象所使用的一致界面。
课本实例:
基金股票
代码如下:
[csharp] viewplaincopyprint?
1.//基金类
2. class fund
3. {
4. stock1 gu1;
5. stock2 gu2;
6. public fund()
7. {
8. gu1=new stock1 ();
9. gu2 =new stock2 ();
10. }
11. public void buyfund()
12. {
13. gu1.buy();
14. gu2.buy();
15. }
16. public void sellfund()
17. {
18. gu1.sell();
19. gu2.sell ();
20. }
21. }
享元模式
运用共享技术有效地支持大量细粒度的对象。
应用:
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时,就应该考虑使用。
还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
举例说明:
例如:
公共交换电话网(PSTN)是享元的一个例子。
有一些资源例如拨号音发生器、振铃发生器和拨号接收器是必须由所有用户共享的。
课本实例:
多个网站,不同形式(博客,新闻发布等)
如图:
代码如下:
[csharp] viewplaincopyprint?
1.//用户
2. public class User
3. {
4. private string name;
5. public User(string name)
6. {
7. this.name = name;
8.
9. }
10. public string Name
11. {
12. get { return name; }
13. }
14. }
15. //网站抽象类
16. abstract class WebSite
17. {
18. public abstract void Use(User user);
19. }
20. //具体网站类
21. class ConcreteWebSite :
WebSite
22. {
23. private string name = "";
24. public ConcreteWebSite(string name)
25. {
26. this.name = name;
27.
28. }
29. public override void Use(User user)
30. {
31. Console.WriteLine("网站分类:
" + name + "用户:
" + user.Name);
32. }
33.
34. }
35. //网站工厂类
36. class WebSiteFactory
37. {
38. private Hashtable flyweights = new Hashtable();
39. //获得网站分类
40. public WebSite GetWebSiteCategory(string key)
41. {
42. if (!
flyweights.ContainsKey(key))
43. flyweights.Add(key, new ConcreteWebSite(key));
44. return ((WebSite)flyweights[key]);
45. }
46. //获得网站分类总数
47. public int GetWebSiteCount()
48. {
49. return flyweights.Count;
50. }
51. }
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
方法:
1,定义一个公共接口类(subject类)
2,定义一个真实的类(代理所代表的真实实体)(RealSubject类)
3,代理类,保存一个引用使得代理可以访问实体,并提供一个与公共接口相同的接口,这样代理就可以用来替代实体
课本实例:
代别人追求女孩
如图:
代码如下:
[csharp] viewplaincopyprint?
1.//被追求者类
2. class SchoolGirl
3. {
4. private string name;
5. public string Name
6. {
7. get { return name; }
8. set { name = value; }
9. }
10. }
11. //代理接口
12. interface IGiveGift
13. {
14. void GiveDolls();
15. void GiveFlowers();
16. void GiveChocolate();
17. }
18. //追求者类
19. class pursuit :
IGiveGift
20. {
21. SchoolGirl mm;
22. public pursuit(SchoolGirl mm)
23. {
24. this.mm = mm;
25.
26. }
27. public void GiveDolls()
28. {
29. Console.WriteLine(mm.Name + "送你洋娃娃");
30.
31. }
32. public void GiveFlowers()
33. {
34. Console.WriteLine(mm.Name + "送你鲜花");
35.
36. }
37. public void GiveChocolate()
38. {
39. Console.WriteLine(mm.Name + "送你巧克力");
40.
41. }
42. }
43. //代理类
44. class proxy :
IGiveGift
45. {
46. pursuit gg;
47. public proxy(SchoolGirl mm)
48. {
49. gg = new pursuit(mm);
50.
51. }
52. public void GiveDolls()
53. {
54. gg.GiveDolls();
55.
56. }
57. public void GiveFlowers()
58. {
59. gg.GiveFlowers();
60.
61. }
62. public void GiveChocolate()
63. {
64. gg.GiveChocolate();
65.
66. }
67. }