我是在HeadFirst上学到的装饰者模式,他是用Java编的,我改成了C#代码,代码如下:
using System;
using System.Collections.Generic;
using System.Text;namespace DesignModel
{
class DecoratorPattern
{
public void TestDecorator()
{
Beverage be = new Espresso();
be = new Mocha(be);
be = new Mocha(be);
be = new Whip(be);
Console.WriteLine(be.getDescription()+" $"+be.cost());
}
}//****************************************************
public abstract class Beverage
{
protected string description = "Unknown Beverage"; public 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 Mocha : CondimentDecorator
{
Beverage beverage; public Mocha(Beverage beverage)
{
this.beverage = beverage;
} public override string getDescription()
{
return beverage.getDescription() + ", Mocha";
} public override double cost()
{
return beverage.cost() + 0.20;
}
} public class Whip : CondimentDecorator
{
Beverage beverage; public Whip(Beverage beverage)
{
this.beverage = beverage;
} public override string getDescription()
{
return beverage.getDescription() + ", Whip";
} public override double cost()
{
return beverage.cost() + 0.70;
}
}}
为啥输出的结果是Unknown Beverage
而不是:Espresso, Mocha, Mocha, Whip
using System;
using System.Collections.Generic;
using System.Text;namespace DesignModel
{
class DecoratorPattern
{
public void TestDecorator()
{
Beverage be = new Espresso();
be = new Mocha(be);
be = new Mocha(be);
be = new Whip(be);
Console.WriteLine(be.getDescription()+" $"+be.cost());
}
}//****************************************************
public abstract class Beverage
{
protected string description = "Unknown Beverage"; public 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 Mocha : CondimentDecorator
{
Beverage beverage; public Mocha(Beverage beverage)
{
this.beverage = beverage;
} public override string getDescription()
{
return beverage.getDescription() + ", Mocha";
} public override double cost()
{
return beverage.cost() + 0.20;
}
} public class Whip : CondimentDecorator
{
Beverage beverage; public Whip(Beverage beverage)
{
this.beverage = beverage;
} public override string getDescription()
{
return beverage.getDescription() + ", Whip";
} public override double cost()
{
return beverage.cost() + 0.70;
}
}}
为啥输出的结果是Unknown Beverage
而不是:Espresso, Mocha, Mocha, Whip
be = new Mocha(be);
be = new Whip(be);
~~~~~~~~~~~~~~~~~~~~~~~
这边确定没有写错?
你还是自己在好好把装饰者模式看看吧.装饰者的核心是,继承被装饰者类的框架并且添加被装饰者的引用,来增加操作.你建立Beverage 和CondimentDecorator的时候有点问题,粗略把你的程序修改了下.(测试通过)..
using System;
using System.Collections.Generic;
using System.Text;namespace csdn_2009._4._0
{
class DecoratorPattern
{
public void TestDecorator()
{
Beverage be = new Espresso();
be = new Mocha(be);
be = new Mocha(be);
be = new Whip(be);
Console.WriteLine(be.getDescription() + " $" + be.cost());
}
static void Main(string[] args)
{
DecoratorPattern dp = new DecoratorPattern();
dp.TestDecorator();
Console.ReadLine();
}
} //****************************************************
public abstract class Beverage
{
protected string description = "Unknown Beverage"; public abstract string getDescription();
//{
// return description;
//} public abstract double cost();
} //++++++++++++++++++++++++++++++++++++++++++++++++++++ public abstract class CondimentDecorator : Beverage
{
protected Beverage _beverage ;
//public abstract string getDescription();
} //***************************************************** public class Espresso : CondimentDecorator //Beverage
{
public Espresso()
{
description = "Espresso";
}
public Espresso(Beverage b)
{
this._beverage = b;
}
public override string getDescription()
{
if (_beverage != null)
return _beverage.getDescription() + this.description;
else
return this.description;
} public override double cost()
{
if (_beverage != null)
return _beverage.cost() + 1.99;
else
return 1.99;
}
}
public class Mocha : CondimentDecorator
{
//Beverage beverage; public Mocha(Beverage beverage)
{
this._beverage = beverage;
} public override string getDescription()
{
if (_beverage != null)
return _beverage.getDescription() + ", Mocha";
else
return "Mocha";
} public override double cost()
{
if (_beverage != null) return _beverage.cost() + 0.20;
else
return 0.20;
}
} public class Whip : CondimentDecorator
{
//Beverage beverage; public Whip(Beverage beverage)
{
this._beverage = beverage;
} public override string getDescription()
{
if (_beverage != null)
return _beverage.getDescription() + ", Whip";
else
return "Whip";
} public override double cost()
{
if (_beverage != null)
return _beverage.cost() + 0.70;
else
return 0.70;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;namespace _009._4._0
{
class Program
{
static void Main(string[] args)
{
Espresso espresso = new Espresso();
CondimentDecorator decorator1 = new MochaDecorator(espresso);
CondimentDecorator decorator2 = new MochaDecorator(decorator1);
CondimentDecorator decorator3 = new WhipDecorator(decorator2);
CondimentDecorator decorator4 = new EspressoDecorator(decorator3);
Console.WriteLine(decorator4.getDescription() + "\tCost :" + decorator4.cost());
Console.ReadLine();
}
}
public abstract class Beverage
{
protected string description = "Unknown Beverage"; public abstract string getDescription();
public abstract double cost();
} public abstract class CondimentDecorator : Beverage
{
protected Beverage _beverage;
} public class Espresso : Beverage
{
public Espresso()
{
description = "Espresso";
}
public override string getDescription()
{
return this.description;
} public override double cost()
{
return 1.99;
}
}
public class Mocha : Beverage
{
public Mocha()
{
description = "Mocha";
}
public override string getDescription()
{
return this.description;
} public override double cost()
{
return 0.20;
}
}
public class Whip : Beverage
{
public Whip()
{
description = "Whip";
}
public override string getDescription()
{
return this.description;
} public override double cost()
{
return 0.70;
}
} public class MochaDecorator : CondimentDecorator
{
public MochaDecorator(Beverage beverage)
{
this._beverage = beverage;
} public override string getDescription()
{
return _beverage.getDescription() + ", Mocha";
} public override double cost()
{
return _beverage.cost() + 0.20;
}
}
public class WhipDecorator : CondimentDecorator
{
public WhipDecorator(Beverage beverage)
{
this._beverage = beverage;
} public override string getDescription()
{
return _beverage.getDescription() + ", Whip"; } public override double cost()
{
return _beverage.cost() + 0.70; }
}
public class EspressoDecorator : CondimentDecorator
{
public EspressoDecorator(Beverage beverage)
{
this._beverage = beverage;
} public override string getDescription()
{
return _beverage.getDescription() + ", Espresso"; } public override double cost()
{
return _beverage.cost() + 1.99; }
}}