您的位置:首页 > 其它

设计模式之装饰器

2009-08-21 09:53 429 查看
装饰器顾名思义就是给一个人带发夹,带首饰打扮打扮。也就是给现有的对象添加新东西,这就引起一个话题,为什么大家不用继承呢?如果要加多个新东西,难道我们每加个东西就要继承前面一个对象,这显然会造成混乱,会使类不断的膨胀。而装饰器模式就避免了这样的问题。说了这么多装饰器模式主要防止类膨胀,他的特点:

1 原始对象对装饰器一无所知。也不知道数量。

2 各个装饰器(也可以说对象)彼此独立,发夹是发夹,首饰是首饰,靴子是靴子,他们之间不与其他装饰器发生冲突。

3 各个装饰器可以随意配对在一起。

4 不需要引入一个包含各种装饰的特性类??????

现在做个例子,有个女孩(componet)要打扮自己,她可以配 发夹(decarator),可以穿 靴子(decarator),可以穿 丝袜(decarator).这个女孩可以随意搭配这些装饰品。

首先 我们定义下 发夹 靴子 丝袜 三个对象装饰品。

public class BootsDecorator
{
/// <summary>
/// 靴子
/// </summary>
/// <param name="Size"></param>
public BootsDecorator(string Size)
{
size=Size;
}
private string size;
public override string ToString()
{
return string.Format("穿着{0}鞋",size);
}
}

public class StockingsDecorator
{
/// <summary>
/// 丝袜
/// </summary>
/// <param name="Shape"></param>
/// <param name="Color"></param>
/// <param name="Size"></param>
public StockingsDecorator(string Shape,string Color,string Size)
{
shape = Shape;
color=Color;
size = Size;
}
private string shape;

private string color;

private string size;

public override string ToString()
{
return string.Format("穿着{0}{1}{2}丝袜", size, color, shape);
}

}
/// <summary>
/// 发夹
/// </summary>
public class HairpinDecorator
{
public HairpinDecorator(string Color)
{
color = Color;
}

private string color;

public override string ToString()
{
return string.Format("戴着{0}发夹的", color);
}

}


下面在定义一个女孩主体。

public class Girl
{
/// <summary>
/// 鞋子
/// </summary>
private BootsDecorator _bt;

/// <summary>
/// 丝袜
/// </summary>
private StockingsDecorator _stk;

/// <summary>
/// 发夹
/// </summary>
private HairpinDecorator _hp;

/// <summary>
/// 鞋子和丝袜混搭mix macth
/// </summary>
/// <param name="bt"></param>
/// <param name="stk"></param>
public Girl(BootsDecorator bt, StockingsDecorator stk)
{
_bt = bt;

_stk = stk;
}

/// <summary>
/// 鞋子,丝袜,发夹混搭mix macth
/// </summary>
/// <param name="bt"></param>
/// <param name="stk"></param>
/// <param name="hp"></param>
public Girl(BootsDecorator bt, StockingsDecorator stk, HairpinDecorator hp)
{
_bt = bt;

_stk = stk;

_hp = hp;
}

/// <summary>
/// 丝袜,发夹混搭mix macth
/// </summary>
/// <param name="stk"></param>
/// <param name="hp"></param>
public Girl(StockingsDecorator stk, HairpinDecorator hp)
{
_stk = stk;

_hp = hp;
}

public void show()
{
string seewhat="我看见一个";

if (_bt != null)
{
seewhat += _bt.ToString();
}
if (_hp != null)
{
seewhat += _hp.ToString();
}
if (_stk != null)
{
seewhat += _stk.ToString();
}
seewhat += "的女孩,口水直流";

Console.WriteLine(seewhat);
}

}


然后我们实现她。看看女孩长什么样

class Program
{
static void Main(string[] args)
{

new Girl(new BootsDecorator("高跟"), new StockingsDecorator("网状", "黑色", "长")).show();

new Girl(new BootsDecorator("高跟"), new StockingsDecorator("网状", "黑色", "长"),new HairpinDecorator("红色")).show();

new Girl(new StockingsDecorator("网状", "黑色", "长"), new HairpinDecorator("红色")).show();

string a = Console.ReadLine();

}
}


输出结果



总结

存在一些组件而无法继承它

你希望为他们额外添加行为或者状态,改变该类中某些对象,且没有影响该类其他对象。

而这些行为和状态,你在项目执行时却无法获知。

比较

Decorator 装饰器模式:采用组装整合其他对象来实现,没有使用继承类或者接口实现。

Adapter 适配器模式: 在不同类中通过接口搭接起来。

Composite组合模式:聚集具有接口的对象而无需继承其对象接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: