装饰模式
2010-08-26 22:06 Clingingboy 阅读(579) 评论(0) 编辑 收藏 举报此模式采用组合非继承的方式来扩展对象职责.
.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); } }
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);
也可以继续定义装饰器,如添加文字功能
photo = new Photo(); tag = new TaggedPhoto (photo,"Jug"); composition = new BorderedPhoto(tag, Color.Yellow);
此模式原型有个缺点,即每个装饰器,必须要调用其中组件的方法.虽然灵活,当改进后的行为模式更加方便.可以添加一个集合来存取一个装饰器的集合.
模式可灵活运用之,不必死套,在编码中自然就可以体现的出来.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2009-08-26 Spring.NET学习笔记(6)-基础AOP