using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace Given { public class Photo : Form { Image image; public Photo() { //string path = Application.StartupPath + "//Image//SWFDecompiler_icon.jpg"; image = new Bitmap(@"E:/Study/Test/WebApplication1/WindowsFormsApplication1/Image/SWFDecompiler_icon.jpg"); this.Text = "Lemonade"; this.Paint += new PaintEventHandler(Drawer); } public virtual void Drawer(object source, PaintEventArgs e) { e.Graphics.DrawImage(image, 100, 60); } } class DecoratorPatternExample { //简单的BorderedPhoto装饰器为照片添加一个固定大小的边框 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); } } //TaggedPhoto装饰器跟踪标签的使用并为其编号,从而给出特定标签被打印的位置 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(tag); 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; } } [STAThread] static void Main() { Photo photo; TaggedPhoto foodTaggedPhoto, colorTaggedPhoto, tag; BorderedPhoto composition; //合成一张拥有两个TaggedPhoto和一个蓝色BorderedPhoto装饰的照片 photo = new Photo(); Application.Run(photo); foodTaggedPhoto = new TaggedPhoto(photo, "Food"); colorTaggedPhoto = new TaggedPhoto(foodTaggedPhoto, "Blue"); composition = new BorderedPhoto(colorTaggedPhoto, Color.Blue); Application.Run(composition); //合成一张拥有两个TaggedPhoto和一个黄色BorderedPhoto装饰的照片 photo = new Photo(); tag = new TaggedPhoto(photo, "Jud"); composition = new BorderedPhoto(tag, Color.Yellow); Application.Run(composition); Console.WriteLine(tag.ListTaggedPhotos()); } } }