装饰模式

本文通过一个具体的图片展示案例,详细介绍了装饰模式的实现方法及其在.NET应用中的变体形式。展示了如何通过组合而非继承的方式扩展对象职责,以及如何在原有功能的基础上添加新的行为。

      此模式采用组合非继承的方式来扩展对象职责.

image_2

.net的应用中,如asp.net ajax的behavior,wpf和silverlight的附加属性,都可以认为是装饰模式的变体.但稍微有些变化.都起到了装饰的作用.

上面的uml图给予一个参考,但非死规定,理解思想就好,如接口也可以是抽象类.

来看一个关于图片的示例

1.定义组件基类(Component,缺省无接口),呈现一幅图片

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);
      }
    }

image_4

2.添加图片边框装饰对象

其在构造函数中传入了一个Photo对象,在原基础上画了一个边框

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 composition = new BorderedPhoto(new Photo(), Color.Blue);


效果如下
image_8 

也可以继续定义装饰器,如添加文字功能

photo = new Photo();
 tag = new TaggedPhoto (photo,"Jug");
 composition = new BorderedPhoto(tag, Color.Yellow);

image_10

 

此模式原型有个缺点,即每个装饰器,必须要调用其中组件的方法.虽然灵活,当改进后的行为模式更加方便.可以添加一个集合来存取一个装饰器的集合.

模式可灵活运用之,不必死套,在编码中自然就可以体现的出来.

转载于:https://www.cnblogs.com/Clingingboy/archive/2010/08/26/1809536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值