[索引页] [源码下载]

乐在其中设计模式(C#) – 装饰模式(Decorator Pattern)

作者:webabcd

介绍
动态地被一个目标上加有额外的任务。就扩大功能而言,它比生成子类方式更加灵活。

示例
发一个Message实体类,某个对象对她的操作有Insert()和Get()方法,现在扩大这个目标的作用。
图片 1

MessageModel

图片 2using System;
图片 3using System.Collections.Generic;
图片 4using System.Text;
图片 5
图片 6namespace Pattern.Decorator
图片 7图片 8图片 9{
图片 10图片 11    /**//// <summary>
图片 12    /// Message实体类
图片 13    /// </summary>
图片 14    public class MessageModel
图片 15图片 16    图片 17{
图片 18图片 19        /**//// <summary>
图片 20        /// 构造函数
图片 21        /// </summary>
图片 22        /// <param name=”msg”>Message内容</param>
图片 23        /// <param name=”pt”>Message发布时间</param>
图片 24        public MessageModel(string msg, DateTime pt)
图片 25图片 26        图片 27{
图片 28            this._message = msg;
图片 29            this._publishTime = pt;
图片 30        }
图片 31
图片 32        private string _message;
图片 33图片 34        /**//// <summary>
图片 35        /// Message内容
图片 36        /// </summary>
图片 37        public string Message
图片 38图片 39        图片 40{
图片 41图片 42            get 图片 43{ return _message; }
图片 44图片 45            set 图片 46{ _message = value; }
图片 47        }
图片 48
图片 49        private DateTime _publishTime;
图片 50图片 51        /**//// <summary>
图片 52        /// Message发布时间
图片 53        /// </summary>
图片 54        public DateTime PublishTime
图片 55图片 56        图片 57{
图片 58图片 59            get 图片 60{ return _publishTime; }
图片 61图片 62            set 图片 63{ _publishTime = value; }
图片 64        }
图片 65    }
图片 66}
图片 67

AbstractMessage

图片 68using System;
图片 69using System.Collections.Generic;
图片 70using System.Text;
图片 71
图片 72namespace Pattern.Decorator
图片 73图片 74图片 75{
图片 76图片 77    /**//// <summary>
图片 78    /// 操作Message的泛构件(Component)
图片 79    /// </summary>
图片 80    public abstract class AbstractMessage
图片 81图片 82    图片 83{
图片 84图片 85        /**//// <summary>
图片 86        /// 获取Message
图片 87        /// </summary>
图片 88        /// <returns></returns>
图片 89        public abstract List<MessageModel> Get();
图片 90
图片 91图片 92        /**//// <summary>
图片 93        /// 插入Message
图片 94        /// </summary>
图片 95        /// <param name=”mm”>Message实体对象</param>
图片 96        /// <returns></returns>
图片 97        public abstract bool Insert(MessageModel mm);
图片 98    }
图片 99}
图片 100

SqlMessage

图片 101using System;
图片 102using System.Collections.Generic;
图片 103using System.Text;
图片 104
图片 105namespace Pattern.Decorator
图片 106图片 107图片 108{
图片 109图片 110    /**//// <summary>
图片 111    /// Sql方式操作Message(ConcreteComponent)
图片 112    /// </summary>
图片 113    public class SqlMessage : AbstractMessage
图片 114图片 115    图片 116{
图片 117图片 118        /**//// <summary>
图片 119        /// 获取Message
图片 120        /// </summary>
图片 121        /// <returns></returns>
图片 122        public override List<MessageModel> Get()
图片 123图片 124        图片 125{
图片 126            List<MessageModel> l = new List<MessageModel>();
图片 127            l.Add(new MessageModel(“SQL方式获得Message”, DateTime.Now));
图片 128
图片 129            return l;
图片 130        }
图片 131
图片 132图片 133        /**//// <summary>
图片 134        /// 插入Message
图片 135        /// </summary>
图片 136        /// <param name=”mm”>Message实体对象</param>
图片 137        /// <returns></returns>
图片 138        public override bool Insert(MessageModel mm)
图片 139图片 140        图片 141{
图片 142            // 代码略
图片 143            return true;
图片 144        }
图片 145    }
图片 146}
图片 147

XmlMessage

图片 148using System;
图片 149using System.Collections.Generic;
图片 150using System.Text;
图片 151
图片 152namespace Pattern.Decorator
图片 153图片 154图片 155{
图片 156图片 157    /**//// <summary>
图片 158    /// Xml方式操作Message(ConcreteComponent)
图片 159    /// </summary>
图片 160    public class XmlMessage : AbstractMessage
图片 161图片 162    图片 163{
图片 164图片 165        /**//// <summary>
图片 166        /// 获取Message
图片 167        /// </summary>
图片 168        /// <returns></returns>
图片 169        public override List<MessageModel> Get()
图片 170图片 171        图片 172{
图片 173            List<MessageModel> l = new List<MessageModel>();
图片 174            l.Add(new MessageModel(“XML方式获得Message”, DateTime.Now));
图片 175
图片 176            return l;
图片 177        }
图片 178
图片 179图片 180        /**//// <summary>
图片 181        /// 插入Message
图片 182        /// </summary>
图片 183        /// <param name=”mm”>Message实体对象</param>
图片 184        /// <returns></returns>
图片 185        public override bool Insert(MessageModel mm)
图片 186图片 187        图片 188{
图片 189            // 代码略
图片 190            return true;
图片 191        }
图片 192    }
图片 193}
图片 194

AbstractMessageWrapper

图片 195using System;
图片 196using System.Collections.Generic;
图片 197using System.Text;
图片 198
图片 199namespace Pattern.Decorator
图片 200图片 201图片 202{
图片 203图片 204    /**//// <summary>
图片 205    /// 装饰AbstractMessage(Decorator)
图片 206    /// </summary>
图片 207    public abstract class AbstractMessageWrapper : AbstractMessage
图片 208图片 209    图片 210{
图片 211        private AbstractMessage _abstractMessage;
图片 212
图片 213图片 214        /**//// <summary>
图片 215        /// 构造函数
图片 216        /// </summary>
图片 217        /// <param name=”abstractMessage”>AbstractMessage</param>
图片 218        public AbstractMessageWrapper(AbstractMessage abstractMessage)
图片 219图片 220        图片 221{
图片 222            this._abstractMessage = abstractMessage;
图片 223        }
图片 224
图片 225图片 226        /**//// <summary>
图片 227        /// 获取Message
图片 228        /// </summary>
图片 229        /// <returns></returns>
图片 230        public override List<MessageModel> Get()
图片 231图片 232        图片 233{
图片 234            return _abstractMessage.Get();
图片 235        }
图片 236
图片 237图片 238        /**//// <summary>
图片 239        /// 插入Message
图片 240        /// </summary>
图片 241        /// <param name=”mm”>Message实体对象</param>
图片 242        /// <returns></returns>
图片 243        public override bool Insert(MessageModel mm)
图片 244图片 245        图片 246{
图片 247            return _abstractMessage.Insert(mm);
图片 248        }
图片 249    }
图片 250}
图片 251

CheckUserWrapper

图片 252using System;
图片 253using System.Collections.Generic;
图片 254using System.Text;
图片 255
图片 256namespace Pattern.Decorator
图片 257图片 258图片 259{
图片 260图片 261    /**//// <summary>
图片 262    /// 扩展出用户征的功效(ConcreteDecorator)
图片 263    /// </summary>
图片 264    public class CheckUserWrapper : AbstractMessageWrapper
图片 265图片 266    图片 267{
图片 268图片 269        /**//// <summary>
图片 270        /// 构造函数
图片 271        /// </summary>
图片 272        /// <param name=”abstractMessage”>AbstractMessage</param>
图片 273        public CheckUserWrapper(AbstractMessage abstractMessage)
图片 274            : base(abstractMessage)
图片 275图片 276        图片 277{
图片 278            
图片 279        }
图片 280
图片 281图片 282        /**//// <summary>
图片 283        /// 获取Message
图片 284        /// </summary>
图片 285        /// <returns></returns>
图片 286        public override List<MessageModel> Get()
图片 287图片 288        图片 289{
图片 290            List<MessageModel> l = base.Get();
图片 291
图片 292            foreach (MessageModel mm in l)
图片 293图片 294            图片 295{
图片 296                mm.Message += “(经过用户征)”;
图片 297            }
图片 298
图片 299            return l;
图片 300        }
图片 301
图片 302图片 303        /**//// <summary>
图片 304        /// 插入Message
图片 305        /// </summary>
图片 306        /// <param name=”mm”>Message实体对象</param>
图片 307        /// <returns></returns>
图片 308        public override bool Insert(MessageModel mm)
图片 309图片 310        图片 311{
图片 312            // 在此地扩展功能
图片 313
图片 314            return base.Insert(mm);
图片 315        }
图片 316
图片 317    }
图片 318}
图片 319

CheckInputWrapper

图片 320using System;
图片 321using System.Collections.Generic;
图片 322using System.Text;
图片 323
图片 324namespace Pattern.Decorator
图片 325图片 326图片 327{
图片 328图片 329    /**//// <summary>
图片 330    /// 扩展出输入验证的效益(ConcreteDecorator)
图片 331    /// </summary>
图片 332    public class CheckInputWrapper : AbstractMessageWrapper
图片 333图片 334    图片 335{
图片 336图片 337        /**//// <summary>
图片 338        /// 构造函数
图片 339        /// </summary>
图片 340        /// <param name=”abstractMessage”>AbstractMessage</param>
图片 341        public CheckInputWrapper(AbstractMessage abstractMessage)
图片 342            : base(abstractMessage)
图片 343图片 344        图片 345{
图片 346            
图片 347        }
图片 348
图片 349图片 350        /**//// <summary>
图片 351        /// 获取Message
图片 352        /// </summary>
图片 353        /// <returns></returns>
图片 354        public override List<MessageModel> Get()
图片 355图片 356        图片 357{
图片 358            List<MessageModel> l = base.Get();
图片 359
图片 360            foreach (MessageModel mm in l)
图片 361图片 362            图片 363{
图片 364                mm.Message += “(经过输入验证)”;
图片 365            }
图片 366
图片 367            return l;
图片 368        }
图片 369
图片 370图片 371        /**//// <summary>
图片 372        /// 插入Message
图片 373        /// </summary>
图片 374        /// <param name=”mm”>Message实体对象</param>
图片 375        /// <returns></returns>
图片 376        public override bool Insert(MessageModel mm)
图片 377图片 378        图片 379{
图片 380            // 在此间扩展功能
图片 381
图片 382            return base.Insert(mm);
图片 383        }
图片 384    }
图片 385}
图片 386

Test

图片 387using System;
图片 388using System.Data;
图片 389using System.Configuration;
图片 390using System.Collections;
图片 391using System.Web;
图片 392using System.Web.Security;
图片 393using System.Web.UI;
图片 394using System.Web.UI.WebControls;
图片 395using System.Web.UI.WebControls.WebParts;
图片 396using System.Web.UI.HtmlControls;
图片 397
图片 398using Pattern.Decorator;
图片 399
图片 400public partial class Decorator : System.Web.UI.Page
图片 401图片 402图片 403{
图片 404    protected void Page_Load(object sender, EventArgs e)
图片 405图片 406    图片 407{
图片 408        AbstractMessage message = new SqlMessage();
图片 409
图片 410        AbstractMessageWrapper amr = new CheckUserWrapper(message);
图片 411
图片 412        Response.Write(amr.Get()[0].Message + ” ” + amr.Get()[0].PublishTime.ToString());
图片 413        Response.Write(“<br />”);
图片 414
图片 415        AbstractMessageWrapper amr2 = new CheckInputWrapper(message);
图片 416
图片 417        Response.Write(amr2.Get()[0].Message + ” ” + amr2.Get()[0].PublishTime.ToString());
图片 418        Response.Write(“<br />”);
图片 419
图片 420        AbstractMessageWrapper amr3 = new CheckUserWrapper(message);
图片 421        AbstractMessageWrapper amr4 = new CheckInputWrapper(amr3);
图片 422
图片 423        Response.Write(amr4.Get()[0].Message + ” ” + amr4.Get()[0].PublishTime.ToString());
图片 424        Response.Write(“<br />”);
图片 425    }
图片 426}
图片 427

运行结果
SQL方式取Message(经过用户征) 2007-5-13 19:34:01
SQL方式得到Message(经过输入验证) 2007-5-13 19:34:01
SQL方式获取Message(经过用户征)(经过输入验证) 2007-5-13 19:34:01

参考
http://www.dofactory.com/Patterns/PatternDecorator.aspx

OK
[源码下载]

相关文章

网站地图xml地图