动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
eg:,我们买了一部手机,慢慢的给这部手机添加新的装饰,比如说贴膜,添加挂件等。
装饰模式角色:
(1)抽象构件角色:给出一个抽象接口,以规范准备接收附加责任的对象。
public
abstract
class
Phone
{
public
abstract
void
BuyPhone
();
}
(2)具体构件角色:定义一个将要接收附加责任的类。
public
class
ApplePhone:Phone
{
public
override
void
BuyPhone
()
{
Console.WriteLine(
"我买了一个苹果手机"
);
}
}
|
public
abstract
class
Decorator:Phone
{
private
Phone p ;
//该装饰对象装饰到的Phone组件实体对象
public
Decorator(Phone p)
{
this
.p = p;
}
public
override
void
BuyPhone
()
{
if
(
this
.p !=
null
)
{
p.BuyPhone
();
}
}
}
public
class
Sticker:Decorator
{
public
Sticker(Phone p) :
base
(p) { }
public
override
void
BuyPhone
()
{
base
.BuyPhone
();
// 添加新的
行为
AddSticker();
}
public
void
AddSticker()
{
Console.WriteLine(
"现在苹果手机有贴膜了"
);
}
}
public
class
Accessories:Decorator
{
public
Accessories(Phone p) :
base
(p) { }
public
override
void
BuyPhone
()
{
base
.BuyPhone
();
// 添加新的行为
AddAccessories();
}
public
void
AddAccessories()
{
Console.WriteLine(
"现在苹果手机有漂亮的挂件了"
);
}
}
调用:
Phone ap =
new
ApplePhone();
//新买了个苹果手机
Decorator aps =
new
Sticker(ap);
//准备贴膜组件
aps.BuyPhone
();
Decorator apa =
new
Accessories(ap);
//过了几天新增了挂件组件
apa.BuyPhone
();
Sticker s =
new
Sticker(ap);
//准备贴膜组件
Accessories a =
new
Accessories(s);
//同时准备挂件
a.BuyPhone
();
优点:
1. 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
缺点:
2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。