二十四种设计模式:装饰模式(Decorator Pattern)
生活随笔
收集整理的這篇文章主要介紹了
二十四种设计模式:装饰模式(Decorator Pattern)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
裝飾模式(Decorator Pattern)
介紹
動態地給一個對象添加一些額外的職責。就擴展功能而言,它比生成子類方式更為靈活。
示例
有一個Message實體類,某個對象對它的操作有Insert()和Get()方法,現在擴展這個對象的功能。
MessageModel
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// Message實體類/// </summary>public class MessageModel{/// <summary>/// 構造函數/// </summary>/// <param name="msg">Message內容</param>/// <param name="pt">Message發布時間</param>public MessageModel(string msg, DateTime pt){this._message = msg;this._publishTime = pt;}private string _message;/// <summary>/// Message內容/// </summary>public string Message{get { return _message; }set { _message = value; }}private DateTime _publishTime;/// <summary>/// Message發布時間/// </summary>public DateTime PublishTime{get { return _publishTime; }set { _publishTime = value; }}} }AbstractMessage
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// 操作Message的抽象構件(Component)/// </summary>public abstract class AbstractMessage{/// <summary>/// 獲取Message/// </summary>/// <returns></returns>public abstract List<MessageModel> Get();/// <summary>/// 插入Message/// </summary>/// <param name="mm">Message實體對象</param>/// <returns></returns>public abstract bool Insert(MessageModel mm);} }SqlMessage
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// Sql方式操作Message(ConcreteComponent)/// </summary>public class SqlMessage : AbstractMessage{/// <summary>/// 獲取Message/// </summary>/// <returns></returns>public override List<MessageModel> Get(){List<MessageModel> l = new List<MessageModel>();l.Add(new MessageModel("SQL方式獲取Message", DateTime.Now));return l;}/// <summary>/// 插入Message/// </summary>/// <param name="mm">Message實體對象</param>/// <returns></returns>public override bool Insert(MessageModel mm){// 代碼略return true;}} }XmlMessage
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// Xml方式操作Message(ConcreteComponent)/// </summary>public class XmlMessage : AbstractMessage{/// <summary>/// 獲取Message/// </summary>/// <returns></returns>public override List<MessageModel> Get(){List<MessageModel> l = new List<MessageModel>();l.Add(new MessageModel("XML方式獲取Message", DateTime.Now));return l;}/// <summary>/// 插入Message/// </summary>/// <param name="mm">Message實體對象</param>/// <returns></returns>public override bool Insert(MessageModel mm){// 代碼略return true;}} }AbstractMessageWrapper
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// 裝飾AbstractMessage(Decorator)/// </summary>public abstract class AbstractMessageWrapper : AbstractMessage{private AbstractMessage _abstractMessage;/// <summary>/// 構造函數/// </summary>/// <param name="abstractMessage">AbstractMessage</param>public AbstractMessageWrapper(AbstractMessage abstractMessage){this._abstractMessage = abstractMessage;}/// <summary>/// 獲取Message/// </summary>/// <returns></returns>public override List<MessageModel> Get(){return _abstractMessage.Get();}/// <summary>/// 插入Message/// </summary>/// <param name="mm">Message實體對象</param>/// <returns></returns>public override bool Insert(MessageModel mm){return _abstractMessage.Insert(mm);}} }CheckUserWrapper
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// 擴展出用戶驗證的功能(ConcreteDecorator)/// </summary>public class CheckUserWrapper : AbstractMessageWrapper{/// <summary>/// 構造函數/// </summary>/// <param name="abstractMessage">AbstractMessage</param>public CheckUserWrapper(AbstractMessage abstractMessage): base(abstractMessage){}/// <summary>/// 獲取Message/// </summary>/// <returns></returns>public override List<MessageModel> Get(){List<MessageModel> l = base.Get();foreach (MessageModel mm in l){mm.Message += "(經過用戶驗證)";}return l;}/// <summary>/// 插入Message/// </summary>/// <param name="mm">Message實體對象</param>/// <returns></returns>public override bool Insert(MessageModel mm){// 在這里擴展功能return base.Insert(mm);}} }CheckInputWrapper
using System; using System.Collections.Generic; using System.Text;namespace Pattern.Decorator {/// <summary>/// 擴展出輸入驗證的功能(ConcreteDecorator)/// </summary>public class CheckInputWrapper : AbstractMessageWrapper{/// <summary>/// 構造函數/// </summary>/// <param name="abstractMessage">AbstractMessage</param>public CheckInputWrapper(AbstractMessage abstractMessage): base(abstractMessage){}/// <summary>/// 獲取Message/// </summary>/// <returns></returns>public override List<MessageModel> Get(){List<MessageModel> l = base.Get();foreach (MessageModel mm in l){mm.Message += "(經過輸入驗證)";}return l;}/// <summary>/// 插入Message/// </summary>/// <param name="mm">Message實體對象</param>/// <returns></returns>public override bool Insert(MessageModel mm){// 在這里擴展功能return base.Insert(mm);}} }Test
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;using Pattern.Decorator;public partial class Decorator : System.Web.UI.Page {protected void Page_Load(object sender, EventArgs e){AbstractMessage message = new SqlMessage();AbstractMessageWrapper amr = new CheckUserWrapper(message);Response.Write(amr.Get()[0].Message + " " + amr.Get()[0].PublishTime.ToString());Response.Write("<br />");AbstractMessageWrapper amr2 = new CheckInputWrapper(message);Response.Write(amr2.Get()[0].Message + " " + amr2.Get()[0].PublishTime.ToString());Response.Write("<br />");AbstractMessageWrapper amr3 = new CheckUserWrapper(message);AbstractMessageWrapper amr4 = new CheckInputWrapper(amr3);Response.Write(amr4.Get()[0].Message + " " + amr4.Get()[0].PublishTime.ToString());Response.Write("<br />");} } 運行結果
SQL方式獲取Message(經過用戶驗證) 2007-5-13 19:34:01
SQL方式獲取Message(經過輸入驗證) 2007-5-13 19:34:01
SQL方式獲取Message(經過用戶驗證)(經過輸入驗證) 2007-5-13 19:34:01
轉載于:https://www.cnblogs.com/taotaodetuer/p/6183041.html
總結
以上是生活随笔為你收集整理的二十四种设计模式:装饰模式(Decorator Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell学习三十四天----print
- 下一篇: flume+elasticsearch日