首页 > 代码库 > c#设计模式之装饰者模式
c#设计模式之装饰者模式
装饰者模式是动态地扩展一个对象的功能。下面看一个例子:网页中要使用图片,我要上传图片,具体规则:
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:AbstractUpload2 {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#设计模式之装饰者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。