略读-装饰器模式
使用思路:需要某類需要添加新的處理方式,但是不修改類
初始類
// The original Photo class public class Photo : Form { Image image; public Photo () { image = new Bitmap("jug.jpg"); this.Text = "Lemonade"; this.Paint += new PaintEventHandler(Drawer); } ? public virtual void Drawer(Object source, PaintEventArgs e) { e.Graphics.DrawImage(image,30,20); } ? private void InitializeComponent() { this.SuspendLayout(); // // Photo // this.ClientSize = new System.Drawing.Size(283, 250); this.Name = "Photo"; this.ResumeLayout(false); ? }在一些情況需要擴展,但又不想改源代碼。那就看下面是怎么擴展的:
// This simple BorderedPhoto decorator adds a colored BorderedPhoto of fixed size class BorderedPhoto : Photo { Photo photo; Color color; ? public BorderedPhoto (Photo p, Color c) { photo = p; color=c; } ? public override void Drawer(Object source, PaintEventArgs e) { photo.Drawer(source, e); e.Graphics.DrawRectangle(new Pen(color, 10),25,15,215,225); } }集成了原來的類,重新處理了一下圖片的邊框顯示。
這樣單純顯示圖片就用原來的類,需要添加邊框的時候則可以選用這個BorderedPhoto類來處理圖片。
前面的掩飾簡單描述了裝飾其模式。此模式描述應該就算結束了。
--------------------------------以下可忽略------------------------------------
?
?
高級應用則需要深入研究:
// The TaggedPhoto decorator keeps track of the tag number which gives it // a specific place to be written ? class TaggedPhoto : Photo { Photo photo; string tag; int number; static int count; List <string> tags = new List <string> (); public TaggedPhoto(Photo p, string t) { photo = p; tag = t; tags.Add(t); number = ++count; } ? public override void Drawer(Object source, PaintEventArgs e) { photo.Drawer(source,e); e.Graphics.DrawString(tag, new Font("Arial", 16), new SolidBrush(Color.Black), new PointF(80,100+number*20)); } ? public string ListTaggedPhotos() { string s = "Tags are: "; foreach (string t in tags) s +=t+" "; return s; } }為照片添加字符描述。
?
最后看下調用代碼
static void Main () { // Application.Run acts as a simple client Photo photo; TaggedPhoto foodTaggedPhoto, colorTaggedPhoto, tag; BorderedPhoto composition; ? // Compose a photo with two TaggedPhotos and a blue BorderedPhoto photo = new Photo(); Application.Run(photo); foodTaggedPhoto = new TaggedPhoto (photo,"Food"); colorTaggedPhoto = new TaggedPhoto (foodTaggedPhoto,"Yellow"); composition = new BorderedPhoto(colorTaggedPhoto, Color.Blue); Application.Run(composition); Console.WriteLine(colorTaggedPhoto.ListTaggedPhotos()); ? // Compose a photo with one TaggedPhoto and a yellow BorderedPhoto photo = new Photo(); tag = new TaggedPhoto (photo,"Jug"); composition = new BorderedPhoto(tag, Color.Yellow); Application.Run(composition); Console.WriteLine(tag.ListTaggedPhotos()); }顯示原始圖片
第一個,字符foodTaggedPhoto放入了原始類進行處理,結果應該是原始圖片加入food字符
第二個,字符colorTaggedPhoto放入了前一個帶food字符的圖片,再加入了yellow字符
第三個,邊框composition 放入了前一個帶food,yellow的圖片,再加入了藍色邊框
顯示第三張圖(帶food,yellow,藍色邊框)
?
第二次處理
再次初始化原始圖片
第一個,字符tag放入原始類進行處理,結果加入jug字符
第二個,邊框composition 放入前一個jug圖片,家黃色邊框
顯示第二張圖片(帶jug,黃色邊框)
轉載于:https://www.cnblogs.com/my36z/archive/2009/03/27/1422784.html
總結
- 上一篇: 暂停使用QQ
- 下一篇: 在UltraWebGrid单元格中绑定d