装饰者模式的适用场景
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
参与者:
Component: 抽象构件,可以给这些对象动态地添加职责(理解为抽象主体类)。
ConcreteComponent:具体构件。是定义了一个具体的对象(具体主体类)。
Decorator: 抽象装饰类。是装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的 (理解为抽象穿戴类)。
ConcreteDecorator:具体装饰类,起到给Component添加职责的功能(具体穿戴类)。
说白了要先有个主体,然后往主体上添加新的功能.
(比方,先抽象饮品(Component: 抽象构件),然后定义一个具体奶茶类继承它(ConcreteComponent:具体构件))
在抽象一个配料类(Decorator: 抽象装饰类),然后定义一个糖类继承抽象配料类,一个冰类继承抽象配料类(ConcreteDecorator:具体装饰类).
namespace 装饰器模式
{ //抽象构件,可以给这些对象动态地添加职责。
public abstract class BaseGame
{
public abstract void Show();//显示
}
}//主体抽象类,比如说是一个人,其它的穿戴类,往上面添加
class Magic : BaseGame
{//具体构件。是定义了一个具体的对象,也可以给这个对象添加一些职责。
public override void Show()
{
Console.WriteLine(@"我叫Way,我是一个裸装法师.");
}
}//实现主体类
class BaseDecorator : BaseGame
{//抽象装饰类。是装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。
private readonly BaseGame _game = null;
public BaseDecorator(BaseGame game)
{//结构型设计模式的标配
_game = game;
}
public override void Show()
{
_game.Show();
}
}//定义穿戴类
class 带头盔 : BaseDecorator
{//具体装饰类,起到给Component添加职责的功能。
public 带头盔(BaseGame gm) : base(gm)//表示调用父类带参数的构造函数
{ }
public override void Show()
{
base .Show();
Console.WriteLine(@"获得了一个青铜头盔.");
}
}//实现穿戴类
最后结果
例:demohttps://download.csdn.net/download/lw8014/86813352https://download.csdn.net/download/lw8014/86813352