设计模式之结构型模式二.docx

上传人:b****8 文档编号:9985907 上传时间:2023-02-07 格式:DOCX 页数:12 大小:37.96KB
下载 相关 举报
设计模式之结构型模式二.docx_第1页
第1页 / 共12页
设计模式之结构型模式二.docx_第2页
第2页 / 共12页
设计模式之结构型模式二.docx_第3页
第3页 / 共12页
设计模式之结构型模式二.docx_第4页
第4页 / 共12页
设计模式之结构型模式二.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

设计模式之结构型模式二.docx

《设计模式之结构型模式二.docx》由会员分享,可在线阅读,更多相关《设计模式之结构型模式二.docx(12页珍藏版)》请在冰豆网上搜索。

设计模式之结构型模式二.docx

设计模式之结构型模式二

设计模式之结构型模式二

结构型模式:

 装饰模式:

  动态地给一个对象添加一些额外的职责。

优点:

  把类中的装饰功能从类中搬移出去,这样可以简化原有的类。

有效地把类的核心功能和装饰功能区分开了。

  已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承

  装饰模式,给一个对象动态添加额外职责,这些职责需要由用户决定加入的方式和时机。

装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。

就增加功能来说,装饰模式比生成子类更加灵活。

 

方法:

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.   }  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1