有这样一个例子:冰激凌的冰有苹果,桔子等多种味道。选定了冰的种类后,可以在上面点缀杏仁,或者腰果等装饰小点心,制作出:杏仁苹果冰激凌,杏仁桔子冰激凌,腰果桔子冰激凌...,并且这种创建只能在运行时执行,因为在编程的时候,还不能确定顾客会点哪一种冰激凌。这个例子用程序实现如下:
class MainApp
{
static void Main()
{
//用腰果装饰苹果味的冰激凌
DecoratorIcecream ice1 = new CashewNutsDecoratorIcecream(new AppleIcecream());
Console.Write(ice1.getName() + ice1.getSweet());
//用杏仁装饰桔子味的冰激凌
DecoratorIcecream ice2 = new AlmondDecoratorIcecream(new OrangeIcecream());
Console.Write("\n");
Console.Write(ice2.getName() + ice2.getSweet());
}
}
//冰激凌的抽象类。getName返回冰激凌的名字,getSweet返回冰激凌的冰的味道。
abstract class Icecream
{
public abstract string getName();
public abstract string getSweet();
}
//苹果味的冰激凌
class AppleIcecream : Icecream
{
public override string getName()
{
return "苹果冰激凌。";
}
public override string getSweet()
{
return "苹果味。";
}
}
//桔子味的冰激凌
class OrangeIcecream : Icecream
{
public override string getName()
{
return "桔子冰激凌。";
}
public override string getSweet()
{
return "桔子味。";
}
}
//装饰类的抽象类
abstract class DecoratorIcecream
{
public abstract string getName();
public abstract string getSweet();
}
//用腰果装饰的类
class CashewNutsDecoratorIcecream : DecoratorIcecream
{
protected Icecream ice;
public CashewNutsDecoratorIcecream(Icecream ice)
{
this.ice = ice;
}
public override string getName()
{
return "腰果" + ice.getName();
}
public override string getSweet()
{
return ice.getSweet();
}
}
//用杏仁装饰的类
class AlmondDecoratorIcecream : DecoratorIcecream
{
protected Icecream ice;
public AlmondDecoratorIcecream(Icecream ice)
{
this.ice = ice;
}
public override string getName()
{
return "杏仁" + ice.getName();
}
public override string getSweet()
{
return ice.getSweet();
}
}
执行结果如下:
腰果苹果冰激凌。苹果味。
杏仁桔子冰激凌。桔子味。
没有评论:
发表评论