Decoratorパターンオブジェクトに添付動的責任。継承の代替よりも柔軟に提供するために装飾された機能を拡張します。
1.役割
- 抽象コンポーネント(部品)の役割:包装される元のオブジェクトは、抽象クラスまたはインタフェースです。
- 詳細部材(ConcreteComponent)役割:装飾されるべき最終的な実際のオブジェクト、コンポーネント実装クラスです。
- デコレーション(デコレータ)の役割は:また、オブジェクトのコンポーネントインスタンスへの参照を保持して、コンポーネントから継承する抽象クラスです。
- 具体的な装飾(ConcreteComponent)役割:具体的なデコレータオブジェクト、デコレーターの実装クラスはConcreteComponent追加の責任を担っています。
2. Demo背景
- それぞれの茶は茶の店は、オートミール、プリン、小豆、真珠などとして彼の材料の一部を追加することを選択することができます。異なる材料の追加料金は異なる場合があります、またはそれは、私たちすべてがしたいということです、そしてアクセサリーの様々なを追加するので、私たちは、オブジェクトを設計するとき、我々はそれのサブクラスを作成するために、順列と組み合わせに行く、困難に遭遇?これは、明らかに、クラスの爆発、剛性設計の数に良いではありません。この時点で、我々は代わりに相続の組み合わせで、Decoratorパターンを参照することができます。
3.コードの実装
- 抽象コンポーネントクラス(コンポーネント):MilkyTea
public abstract class MilkyTea(奶茶)
{
public string description;
public abstract double GetFee();
//与java不一样,java父类方法不需要加关键词Virtual就可以在子类中重写
public virtual string GetDescription()
{
return description;
}
}
- MilkGreenTea(ミルク緑):具象クラス(ConcreteComponent)の構築
public class MilkGreenTea : MilkyTea
{
public MilkGreenTea()
{
description = "Milk Green Tea";
}
public override double GetFee()
{
return 10;
}
}
- デコレーション(デコ):CondimentDecorator(付属品)
public abstract class CondimentDecorator : MilkyTea
{
public MilkyTea milkyTea;
}
- 具体的な装飾(ConcreteComponent):エンバク(オーツ)、プリン(プディング)
public class Oats : CondimentDecorator
{
public Oats(MilkyTea milkyTea)
{
this.milkyTea = milkyTea;
}
public override double GetFee()
{
return 1 + milkyTea.GetFee();
}
public override string GetDescription()
{
return milkyTea.GetDescription() + ",Oats";
}
}
public class Pudding : CondimentDecorator
{
public Pudding(MilkyTea milkyTea)
{
this.milkyTea = milkyTea;
}
public override double GetFee()
{
return 3 + milkyTea.GetFee();
}
public override string GetDescription()
{
return milkyTea.GetDescription() + ",Pudding";
}
}
- テストコードと業績
static void Main(string[] args)
{
MilkyTea tea = new MilkGreenTea();
Console.WriteLine($"{tea.GetDescription()}:¥{tea.GetFee()}。");
tea = new Pudding(tea);
Console.WriteLine($"{((Pudding)tea).GetDescription()}:¥{tea.GetFee()}。");
tea = new Oats(tea);
Console.WriteLine($"{tea.GetDescription()}:¥{tea.GetFee()}。");
}
4.利点と欠点
- 長所:弾性設計を注入します。オープンとクローズ、拡張しやすいの原則を満たしています。
- 実際のポイント:デザインでは、カテゴリの多くを追加します。