装饰器模式(非详细介绍文)
程序员文章站
2022-04-03 21:15:53
...
1.装饰器模式UML图
截取自《大话设计模式》,侵权联系删。
2.装饰器模式适用场景
1.需要改动的功能非常微小,使用装饰器模式更加灵活。
2.需要增加由一些基本功能排列组合而产生的非常大量的功能,从而使继承关系变得不可实现。
3.举例1(取自《大话设计模式》,侵权删)
//"Person"类(ConcreteComponent)
class Person
{
public Person(){}
private string name;
public Person(string)
{
this.name=name;
}
public virtual void Show()
{
Console.WriteLine("装扮{0}",name);
}
}
//服饰类(Decorator)
class Finery:Person
{
protected Person Component; //用来存放被传入的被装饰类
//打扮
public void Decorator(Person component)
{
this.component=component;
}
public override void Show()
{
if(component!=null)
{
component.Show();
}
}
}
//具体服饰类(ConcreteDecorator)
class TShirts:Finery
{
public override void Show()
{
Console.Write("大T恤");
base.Show();
}
}
class BigTrouser:Finery
{
public override void Show()
{
Console.Write("垮裤");
base.Show();
}
}
//其余类似......
//客户端代码
static void Main(string[] args)
{
//被装饰类
Person xc=new Person("小菜");
Console.Write("\n第一种装扮");
//装饰器类
Sneakers pqx=new Sneakers();
BigTrouser kk=new BigTrouser();
TShirts dtx=new TShirts();
//装饰过程
pqx.Decorator(xc);
kk.Decorator(pqx);
dtx.Decorator(kk);
dtx.Show();
//被装饰类结构没有被改变,还可以再度装饰
Console.Write("\n第二种装饰过程")
LeatherShoes px=new LeatherShoes();
Tie ld=new Tie();
Suit xz=ne Suit();
px.Decorator(xc);
ld.Decorator(px);
xz.Decorator(ld);
xz.Show();
Console.Read();
}
4.例子2(PHP版本)
https://segmentfault.com/a/1190000007544975
5.注意
1.装饰器模式传入被装饰类可以由构造函数完成,也可以自己设计一个函数完成,如例子中的decoartor()
2.装饰器类(不是具体装饰器ConcreteDecorator),需要在被装饰方法中调用传入的装饰类的该方法。
(有点拗口,结合例子多看看)