您的位置:首页 > 编程语言 > C#

装饰者设计模式 -C#

2017-09-29 17:02 246 查看
参考《Head First设计模式》

装饰者模式定义:

动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

主要思想:

将装饰者与被装饰者自同一个超类型;

可以用一个或多个装饰者包装一个对象;

装饰者与被装饰者有相同的超类型,因而在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它;

装饰者可以在被装饰者的行为前/后,添加自己的行为,以达到特定目的;

对象可以在任何时候被装饰,所以可以在运行时动态地装饰对象;

public abstract class Beverage
{
public string description = "UnKnown Beverage.";

public abstract double cost();

public abstract string getDescription();
}

public abstract class Condiment:Beverage
{
}


class Mocha : Condiment
{
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}

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

public override double cost()
{
return this.beverage.cost() + 0.2;
}
}

public class Soy:Condiment
{
Beverage beverage;
public Soy(Beverage beverage)
{
this.beverage = beverage;
}

public override string getDescription()
{
return this.beverage.getDescription() + " , Soy";
}

public override double cost()
{
return this.beverage.cost() + 0.4;
}
}

public class Espresso:Beverage
{
public Espresso()
{
this.description = "Espresso";
}

public override double cost()
{
return 1.99;
}

public override string getDescription()
{
return this.description;
}
}


class HouseBlend : Beverage
{
public HouseBlend()
{
this.description = "House Blend";
}

public override double cost()
{
return 1.01;
}

public override string getDescription()
{
return string.Empty;
}
}


测试代码:

static void Main(string[] args)
{
Beverage beverage = new Espresso();

Console.WriteLine(beverage.getDescription());
Console.WriteLine(beverage.cost());

Beverage beverage2 = new Espresso();
beverage2 = new Mocha(beverage2);
beverage2 = new Soy(beverage2);

Console.WriteLine(beverage2.getDescription());
Console.WriteLine(beverage2.cost());

Console.ReadKey();
}


运行结果:

Espresso

1.99

Espresso, Mocha, Soy

2.59

与书上不同的是,Beverage Condiment抽象类中,对getDescription()方法的处理,应该是在C#中,如果子类不用override覆盖父类的方法,则调用的仍然是父类的方法,因而在所有的子类中,都使用了override重写方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: