冯超

好好工作,天天向上

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

5        Decorator模式

5.1      概述

Decorator模式,又叫装饰模式,就是给一个对象额外地添加一些职责,以适应更多的变化。

5.2      设计

给一个对象添加职责,可以直接修改这个对象,但是这样就变得很危险。本着最大限度不修改原有代码的编码指导思想,应该对这个对象进行包装,再赋予新的对象额外的职责。就如一个步兵有杀伤敌人的功能,再把他装进战车,就额外拥有移动快、防御强的功能了。

5.3      实现

UML图:

示例代码为:

  1using System;
  2
  3namespace Example
  4{
  5    /// <summary>
  6    /// 示例
  7    /// </summary>

  8    class Example
  9    {
 10        /// <summary>
 11        /// 应用程序的主入口点。
 12        /// </summary>

 13        [STAThread]
 14        static void Main(string[] args)
 15        {
 16            //张三今天的计划
 17            Console.WriteLine( "张三今天的计划:" ) ;
 18            Action ZhangSan = new Eat( new Sleep( new Sport( new Action() ) ) ) ;
 19            ZhangSan.Act() ;
 20            //李四今天的计划
 21            Console.WriteLine( "李四今天的计划:" ) ;
 22            Action LiSi = new Sport( new Eat( new Sleep( new Action() ) ) ) ;
 23            LiSi.Act() ;
 24        }

 25        /// <summary>
 26        /// 主要的功能:工作
 27        /// </summary>

 28        public class Action
 29        {
 30            public virtual void Act() 
 31            {
 32                Console.WriteLine( "工作……" ) ;
 33            }

 34        }

 35        /// <summary>
 36        /// 使用Decorator模式,增加额外功能:吃饭
 37        /// </summary>

 38        public class Eat : Action
 39        {
 40            private Action action = null ;
 41
 42            public Eat( Action a )
 43            {
 44                action = a ;
 45            }

 46            public void EatRice()
 47            {
 48                Console.WriteLine( "吃饭……" ) ;
 49            }

 50            public override void Act()
 51            {
 52                this.EatRice() ;
 53                action.Act() ;
 54            }

 55        }

 56        /// <summary>
 57        /// 使用Decorator模式,增加额外功能:睡觉
 58        /// </summary>

 59        public class Sleep : Action
 60        {
 61            private Action action = null ;
 62
 63            public Sleep( Action a )
 64            {
 65                action = a ;
 66            }

 67            public void Sleeping()
 68            {
 69                Console.WriteLine( "睡觉……" ) ;
 70            }

 71            public override void Act()
 72            {
 73                this.Sleeping() ;
 74                action.Act() ;
 75            }

 76        }

 77        /// <summary>
 78        /// 使用Decorator模式,增加额外功能:运动
 79        /// </summary>

 80        public class Sport : Action
 81        {
 82            private Action action = null ;
 83
 84            public Sport( Action a )
 85            {
 86                action = a ;
 87            }

 88            public void Sporting()
 89            {
 90                Console.WriteLine( "运动……" ) ;
 91            }

 92            public override void Act()
 93            {
 94                this.Sporting() ;
 95                action.Act() ;
 96            }

 97        }

 98    }

 99}

100
posted on 2005-07-31 20:17  超哥  阅读(752)  评论(2编辑  收藏  举报