C#设计模式之10——装饰器模式

本文介绍了C#中的装饰器模式,通过实例展示了如何使用装饰器模式为按钮添加特殊边框,强调了装饰器模式相比继承的灵活性,以及其在不改变对象类型的情况下动态增加对象功能的能力。同时,文章提到了装饰器模式的不足,如对象类型检查失败和可能导致大量小对象的产生,对代码维护带来的挑战。
摘要由CSDN通过智能技术生成

装饰器模式提供了一种在无需创建新的派生类的情况下修改个体对象行为的方式。

假设我们需要给工具栏中的按钮添加一个特殊的边框,如果我们创建一个新的派生出来的按钮类,那么就意味着这一新类的所有按钮都会有相同的特殊的边框,这可能并不是我们最初想要的结果。替代的做法是,我们可以创建一个装饰器类来修饰按钮,然后从这一主修饰器类中派生出任意特定的装饰器,每个装饰器完成某种特定类型的装饰。这是另一种对象包含比对象继承更受青睐的情况,装饰器是一个图像对象,但是包含了其所装饰的对象,他可以拦截一些图形方法的调用,执行一些附加的计算,然后再把调用传递给其所装饰的底层对象。

 

C#的空间中没有类似的按钮行为,不过我们可以通过装饰一个面板,并使用面板来包含按钮的方式来获得这样的行为。

设计模式一书中建议装饰器应该派生于某个一般性的可视化空间类,然后实际按钮的每个消息都由装饰器类来转发。装饰器这样的类应该作为抽象类,并且应该从该抽象类中派生出所有的做实际工作的装饰器。

 

这样我们这个装饰器的抽象就可以定义为:

using System;
using System.Drawing;
using System.Windows.Forms;
namespace CoolDec
{
    /// <summary>
    /// Summary description for Decorator.
    /// </summary>
    public interface Decorator
    {
        void mouseMove(object sender, MouseEventArgs e);
        void mouseEnter(object sender, EventArgs e);
        void mouseLeave(object sender, EventArgs e);
        void paint(object sender, PaintEventArgs e);
    }
}


要实现的对按钮的装饰效果如图:当鼠标放上按钮以后显示一个特殊的边框

具体的装饰器类的定义:

using System;
using System.Windows.Forms;
using System.Drawing ;
namespace CoolDec
{
	/// <summary>
	/// Summary description for CoolDecorator.
	/// </summary>
	public class CoolDecorator :Panel, Decorator
	{
		protected Control contl;
		protected Pen bPen, wPen, gPen;
		private bool mouse_over;
		protected float x1, y1, x2, y2;
		//----------------------------------
			public CoolDecorator(Control c) {
				contl = c;		//copy in control
				//add button to controls contained in panel
				this.Controls.AddRange(new Control[] {contl});
				locate(c.Location );
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值