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

装饰者模式(C#)实现

2011-12-13 15:32 253 查看
我喜欢户外,然后常常去逛户外装备的店子,一般买了自行车等大件,再买登山包,登山鞋等配件就会有优惠。比如买了辆Giant的车,然后买个bag就有优惠,本案例将配件作为装饰者,简单的实现装饰者模式,对于继承,多态掌握的还是很迷惑。有错误还请各位看官帮忙指出,仪器共同进步!

首先定义一个超类Buybike

publicabstractclassBuybike { protectedstringdescription="ToGetaBike"; publicvirtualstringgetDescription() { returndescription; } publicabstractstringCost(); }
超类下面定义一个装饰者超类OtherDecorator(所有装饰者【案例中配件】的父类)


publicabstractclassOtherDecorator:Buybike
{
//只是为了将装饰者全部置于其下,无具体实现方法
}
下面是两个被装饰的类GiantMerida(捷安特,美利达)
classMerida:Buybike
{
publicMerida()
{
description="Merida";
}
publicoverridestringCost()
{
return"2000RMB";
}
}
publicclassGiant:Buybike
{
publicGiant()
{
description="Giant";
}
publicoverridestringCost()
{
return"3000RMB";
}

}
接下去是所有装饰者(配件),全部继承自OtherDecorator
classAddShirt:OtherDecorator
{
privateBuybikebuyBike;
publicAddShirt(BuybikebuyBike)
{
this.buyBike=buyBike;
}
publicoverridestringgetDescription()
{
returnbuyBike.getDescription()+"Addashirt";
}

publicoverridestringCost()
{
returnbuyBike.Cost()+"shirt'smoney:600RMB";
}
}
classAddShoes:OtherDecorator
{
privateBuybikebuyBike;
publicAddShoes(BuybikebuyBike)
{
this.buyBike=buyBike;
}

publicoverridestringgetDescription()
{
returnbuyBike.getDescription()+"Addashoes";
}

publicoverridestringCost()
{
returnbuyBike.Cost()+"shoe'smoney:300RMB";
}
}
classAddBag:OtherDecorator
{
privateBuybikebuyBike;
publicAddBag(BuybikebuyBike)
{
this.buyBike=buyBike;
}
publicoverridestringgetDescription()
{
returnbuyBike.getDescription()+"Addabag";
}

publicoverridestringCost()
{
returnbuyBike.Cost()+"bag'smoney:200RMB";
}
}
程序运行如下:

classProgram
{
staticvoidMain(string[]args)
{
Buybikea=newGiant();
a=newAddBag(a);
a=newAddShirt(a);
Console.WriteLine(a.Cost());
Console.WriteLine(a.getDescription());
}
}



此模式好处:装饰者和被装饰者从相同基类派生,类型之间的转化非常方便,适合多态的实现。

具体到例子,此处的a具体到是一个基类变量,把它指到下面的子类不必进行类型转化,而且a具体是什么类型,得在运行时才能确定,程序耦合度大大降低。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: