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

1.装饰器模式UML图

截取自《大话设计模式》,侵权联系删。

装饰器模式(非详细介绍文)_第1张图片

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(综合)