装饰者模式(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具体是什么类型,得在运行时才能确定,程序耦合度大大降低。
首先定义一个超类Buybike
超类下面定义一个装饰者超类OtherDecorator(所有装饰者【案例中配件】的父类)
{
//只是为了将装饰者全部置于其下,无具体实现方法
}
{
publicMerida()
{
description="Merida";
}
publicoverridestringCost()
{
return"2000RMB";
}
}
publicclassGiant:Buybike
{
publicGiant()
{
description="Giant";
}
publicoverridestringCost()
{
return"3000RMB";
}
}
{
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";
}
}
程序运行如下:
{
staticvoidMain(string[]args)
{
Buybikea=newGiant();
a=newAddBag(a);
a=newAddShirt(a);
Console.WriteLine(a.Cost());
Console.WriteLine(a.getDescription());
}
}
此模式好处:装饰者和被装饰者从相同基类派生,类型之间的转化非常方便,适合多态的实现。
具体到例子,此处的a具体到是一个基类变量,把它指到下面的子类不必进行类型转化,而且a具体是什么类型,得在运行时才能确定,程序耦合度大大降低。
相关文章推荐
- 设计模式学习(三): 装饰者模式 (附C#实现)
- 《Head First-设计模式》--装饰者模式C++实现
- 第二页(服务端) :远程资源管理器 c#应用源代码,SERVICE + CLIENT 模式 可实现远程文件管理,下载功能
- osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo
- C#实现代理模式
- 与王翔面对面——《设计模式——基于C#的工程化实现及扩展》作者访谈录
- c#单例模式的实现
- 《设计模式--基于C#的工程化实现及扩展》到货了
- C# 单例模式的多种简单实现
- 《模式——工程化实现及扩展》(设计模式C# 版)《创建者模式 Builder》——“自我检验" 参考答案
- 《模式——工程化实现及扩展》(设计模式C# 版)《适配器模式 Adapter》——“自我检验"
- python实现C#中类似于AutoResetEvent类的阻塞模式
- 设计模式学习(四): 1.简单工厂 (附C#实现)
- 单例模式(C#实现)
- 使用Register/Notify模式在C#中实现非托管资源的统一处置
- Decorate(装饰者模式) 实现留言版词汇处理
- 从C#的Singleton设计模式实现看.NET Framework特性对开发者的重要性
- 单例模式的C#实现
- 设计模式C#实现(九)——工厂方法模式和简单工厂
- 《设计模式--基于C#的工程化实现及扩展》 Security Design Pattern 系列 3 检查点模式(Check Point)