欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

装饰器模式(非详细介绍文)

程序员文章站 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),需要在被装饰方法中调用传入的装饰类的该方法。

(有点拗口,结合例子多看看)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: 综合