装饰模式
装饰模式是为已有功能动态的添加更多功能的一种方式。
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。
在主类中加入了新的字段,新的方法和新的逻辑从而增加了主类的复杂度。而这些新加入的东西仅仅是为了满足一些只在某种特定的情况下才会执行的特殊行为需要,而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需求有选择地,按顺序地使用装饰功能包装对象了。(DP)
简单来说就是 动态地给一个对象添加一些额外的职责,就增加功能而言,装饰模式比生成子类更加灵活。
穿衣服 例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 装饰模式
{
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public Person()
{ }
public virtual void Show()
{
Console.WriteLine($"{name}穿");
}
}
class Finery :Person
{
protected Person PersonCompoent;
public Finery(Person person)
{
PersonCompoent = person;
}
public void SetCompoent(Person Compoemt)
{
this.PersonCompoent = Compoemt;
}
public override void Show()
{
if (PersonCompoent!=null)
{
PersonCompoent.Show();
}
}
}
//为已有功能动态地地添加 更多功能的一种方式,
class Client
{
static void Main(string[] args)
{
Person xc = new Person("小min");
TShirt shirt = new TShirt(xc);
Shop shop = new Shop(xc);
tie tie = new tie(xc);
BigTrouser bigTrouser = new BigTrouser(xc);
shop.Show();
tie.Show();
shirt.Show();
bigTrouser.Show();
}
}
class TShirt : Finery
{
private string addedState;
public TShirt(Person person) : base(person)
{
}
public override void Show()
{
base.Show();
addedState = "wear TShirt";
Console.WriteLine(addedState);
}
}
class BigTrouser : Finery
{
private string addedState;
public BigTrouser(Person person) : base(person)
{
}
public override void Show()
{
base.Show();
addedState = "长裤";
Console.WriteLine(addedState);
}
}
class Suit : Finery
{
public Suit(Person person) : base(person)
{
}
private string addedState;
public override void Show()
{
base.Show();
addedState = "西装";
Console.WriteLine(addedState);
}
}
class Shop : Finery
{
public Shop(Person person) : base(person)
{
}
private string addedState;
public override void Show()
{
base.Show();
addedState = "鞋子";
Console.WriteLine(addedState);
}
}
class tie : Finery
{
public tie(Person person) : base(person)
{ }
private string addedState;
public override void Show()
{
base.Show();
addedState = "领带";
Console.WriteLine(addedState);
}
}
}