Но толстый хорёк не был бы таким соросом если бы не придумал, как из каждого своего работника выжать вдвое-втрое больше, чем он может дать.
Вот представьте себе - берет он работника на работу и говорит ему
-«Ты по работе должен будешь копать».
-«Ну, ладно» - говорит работник - «почему бы и нет». И начинает копать. Но не тут-то было. Приносит ему толстый хорек форменную одежду уборщика, декорирует в неё и говорит
-«А теперь, после того, как вскопаешь, ты должен будешь всё тут убрать.»
-«Как же так» - удивляется работник - «вы же сами говорили, что я должен только уметь копать?»
-«Э, нет» - отвечает сорос-хорёк - «копать ты конечно должен уметь, но раз я тебя в форму уборщика задекорировал, ты теперь и убирать будешь...»
Вот такие вот пирожки, с котятами...
Decorator module:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns
{
//Для теста на консоли
//class MainApp
//{
// static void Main()
// {
// // Create ConcreteComponent and two Decorators
// ConcreteWorker c = new ConcreteWorker();
// BuryWorkerDecorator d1 = new BuryWorkerDecorator();
// CleanerWorkerDecorator d2 = new CleanerWorkerDecorator();
// // Link decorators
// d1.SetComponent(c);
// d2.SetComponent(d1);
// d2.Operation();
// // Wait for user
// Console.Read();
// }
//}
//Компонент
abstract class WorkerAbstraction
{
public abstract string TalkToMe();
public abstract void DoWork();
}
//Имплементация работника
class ConcreteWorker : WorkerAbstraction
{
public override string TalkToMe()
{
return "Yes?";
}
public override void DoWork()
{
Dig();
}
private string Dig()
{
return "Копаю я, копаю, сколько же можно-то!?";
}
}
// "Decorator"
abstract class Decorator : WorkerAbstraction
{
protected WorkerAbstraction _worker;
public void SetComponent(WorkerAbstraction worker)
{
this._worker = worker;
}
public override string TalkToMe()
{
return "Yes? What can I help you?";
}
public override void DoWork()
{
if (null!=_worker)
{
_worker.DoWork();
}
}
}
//А здесь он закапывает
class BuryWorkerDecorator : Decorator
{
public override void DoWork()
{
base.DoWork();
Bury();
}
private string Bury()
{
return "Копай-закапывай, копай-закапывай, охренели вы там все что ли!?";
}
}
//А здесь полы моет
class CleanerWorkerDecorator : Decorator
{
public override void DoWork()
{
base.DoWork();
CleanTheFloor();
}
private string CleanTheFloor()
{
return "Мля, ещё и пол вам помой!?";
}
}
}