Minggu, 09 Desember 2007

Decorative Pattern

The most Inner object , Pass the operation to outer object and so on.
This is a nice pattern approach.
here an example

using System;
namespace StarbuzzCoffee
{
class Program
{
static void Main(string[] args)
{
Beverage beverage = new Espresso();
beverage = new Mocca(beverage);
Console.WriteLine("{0} {1}", beverage.Getdescription(), beverage.Cost());

Beverage beverage2 = new Darkroast();
//the pattern is this is inheritance
//so the most inner object return the cost, the outer return + the inner
//and so on and so on till outside
beverage2 = new Mocca(beverage2);//see it change the base desc and
beverage2 = new Mocca(beverage2);//double mocha
Console.WriteLine(beverage2.description + " " + beverage2.Cost());
Console.ReadLine();

}
}


public abstract class Beverage
{
public string description="unknown beverage";
public virtual string Getdescription()
{
return description;
}
public abstract double Cost();
}

//public abstract class CondimentDecorator : Beverage
//{
// public abstract string Getdescription();
//}
public class Espresso : Beverage
{
public Espresso()
{
description = "Espresso";
}
public override double Cost()
{
return 1.99;
}
}
public class Darkroast : Beverage
{
public Darkroast()
{
description = "Darkroast";
}
public override double Cost()
{
return .22;
}
}
public class Houseblend : Beverage
{
public Houseblend()
{
description = "Houseblend";
}
public override double Cost()
{
return .89;
}
}
public class Mocca: Beverage
{
private Beverage beverage;
public Mocca(Beverage theBevarage)
{
beverage = theBevarage;

}
public override string Getdescription()
{
return beverage.Getdescription() + ",Mocha";
}

public override double Cost()
{
return .20 + beverage.Cost();
}
}
}

1 komentar:

salcad mengatakan...

Decorators Pattern can be implemented
on several different ways.
Check my sample program that it can be done through Generic and Interface. http://salcad.blogspot.com/2007/12/generics-decorator-pattern.html