码迷,mamicode.com
首页 > Windows程序 > 详细

c#设计模式之装饰者模式

时间:2016-09-30 18:34:27      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

装饰者模式是动态地扩展一个对象的功能。下面看一个例子:网页中要使用图片,我要上传图片,具体规则:

1、对于一些比较大,甚至几兆的图片,上传后,生成缩略图,生成缩略图可以按照指定尺寸,或者固定宽,高按比例缩放。

2、对于tif格式的图片,通常都比较大,需要转jpg格式的图片,或者转jpg格式后,若发现图片还是很大,再进行压缩处理。

3、对于合适大小的图片,上传上去不做处理。

首先定义一个抽象类,用来实现上传:

 1  public abstract class AbstractUpload
 2     {
 3        
 4         public Stream FileStream { set; get; }
 5 
 6 
 7         public UploadInfo Result { set; get; }
 8  
 9         public abstract byte[] GetContent();
10 
11         public virtual UploadInfo Upload(string listTitle, string fileName, bool isRename = true){
12           //具体上传方法
13         }
14          public virtual UploadInfo GetResult(){
15 
16            //获取上传结果
17          }
18 }

然后定义装饰者的抽象类:

1  public abstract class UploadDecrator:AbstractUpload
2     {
3         public AbstractUpload UpLoader { set; get; }
4 
5     }

下面是按照规定尺寸生成缩略图:

 public class ThumbUpload:UploadDecrator
    {

        public ThumbImageInfo ImgInfo { set; get; }

         public ThumbUpload(AbstractUpload upload,ThumbImageInfo imgInfo)
        {

            this.UpLoader = upload;

            this.ImgInfo = imgInfo;
        }

        public override byte[] GetContent()
        {
           var img= MakeSmallPic();

           return StringUlity.ImgToByte(img);
        }
}

接着,我们实现tif图片的处理:

 1  public class TifImageUpload : UploadDecrator
 2     {
 3         public ThumbImageInfo ImgInfo { set; get; }
 4 
 5         public bool IsCacularMode { set; get; }
 6 
 7         public TifImageUpload(AbstractUpload upload, ThumbImageInfo imgInfo, bool isCacularMode)
 8         {
 9 
10             this.UpLoader = upload;
11 
12             this.ImgInfo = imgInfo;
13 
14             this.IsCacularMode = isCacularMode;
15         }
16 
17         public TifImageUpload(AbstractUpload upload, bool isCacularMode)
18         {
19 
20             this.UpLoader = upload;
21             this.IsCacularMode = isCacularMode;
22         }
23 
24 
25         public override byte[] GetContent()
26         {
27             var img = MakeSmallPic();
28 
29             return StringUlity.ImgToByte(img);
30         }
31 }

看到这儿,可能有人会有疑问,具体的类,为什么不直接继承AbstractUpload呢?因为AbstractUpload类是一个抽象类,它还为其它的各种文件上传使用,为了不影响这个基础的抽象类,所以我们单独定义自己的装饰者抽象类。

看看客户端是如何调用的?

技术分享

这个是上传tif图片,处理为jpg格式,然后再上传。

看到这里,是不是觉得FileStreamUpload f ,这个有点问题,与构造函数的类型不一致呢?且看下文:

 1   /// <summary>
 2     /// 上传文件
 3     /// </summary>
 4     public class FileStreamUpload : AbstractUpload
 5     {
 6 
 7         public FileStreamUpload(Stream stream)
 8         {
 9 
10             this.FileStream = stream;
11         }
12 
13         public override byte[] GetContent()
14         {
15             int iLength = (int)FileStream.Length;
16 
17 
18             Byte[] filecontent=null;
19 
20             if (iLength > 0)
21             {
22                 filecontent = new byte[iLength];
23                 FileStream.Read(filecontent, 0, iLength);
24             }
25             return filecontent;
26         }
27     }

这个是所有文件上传类,也继承自抽象类AbstractUpload。未完待续。。。

 

c#设计模式之装饰者模式

标签:

原文地址:http://www.cnblogs.com/wangqiang3311/p/5924427.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!