大话设计模式-装饰者模式C#与Java对比存在的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了大话设计模式-装饰者模式C#与Java对比存在的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3073字,纯文字阅读大概需要5分钟。
内容图文
最近看了大话设计模式书中的装饰者模式,然后用C#照着写了一遍,发现运行出来的结果和书上不一样,然后又用Java写了一遍 和书上一样,同样的代码,不同的编译器与运行环境,Java和.NET 下面贴上代码
首先是Java实现
Beverage(饮料抽象类)
CondimentDecorator(调料抽象类,继承Beverage)
Latte(拿铁饮料,继承Beverage)
Mocha(摩卡调料,继承CondimentDecorator)
public
abstract
class Beverage {
public String description = "Unkonw";
public String getDescription(){
return description;
}
publicabstractdoublecost();
}
public
abstract
class
CondimentDecorator
extends
Beverage {
public
abstract String getDescription();
}
public
class
Latte
extends
Beverage {
public
Latte(){
description = "Latte Coffee";
}
@Overridepublicdoublecost() {
// TODO Auto-generated method stubreturn21.05;
}
}
public
class
Mocha
extends
CondimentDecorator {
Beverage beverage;
publicMocha(Beverage beverage){
this.beverage = beverage;
}
@Overridepublic String getDescription() {
// TODO Auto-generated method stubreturn beverage.getDescription() + ", Mocha Condiment";
}
@Overridepublicdoublecost() {
// TODO Auto-generated method stubreturn.99 + beverage.cost();
}
}
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
Beverage beverage1 = new Latte();
beverage1 = new Mocha(beverage1);
System.out.println("小明点了:"+beverage1.getDescription()+"咖啡,花了:"+beverage1.cost()+" RMB");
}
运行结果
下面看下C#中的实现
Beverage(饮料抽象类)
CondimentDecorator(调料抽象类,继承Beverage)
Espresso(浓咖啡,继承Beverage)
SoyMilk(豆奶调料,继承CondimentDecorator)
public
abstract
class Beverage
{
publicstring description = "Unknow";
publicstringgetDescription()
{
return description;
}
publicabstractdoublecost();
}
public
abstract
class CondimentDecorator:Beverage
{
publicabstractstringgetDescription();
}
public
class Espresso :Beverage
{
publicEspresso()
{
description = "Espresso Coffee(浓咖啡)";
}
publicoverridedoublecost()
{
return19.00;
}
}
public
class SoyMilk:CondimentDecorator
{
private Beverage beverage;
publicSoyMilk(Beverage bev)
{
this.beverage = bev;
}
publicoverridestringgetDescription()
{
return beverage.getDescription() + "SoyMilk(豆奶调料)";
}
publicoverridedoublecost()
{
return1.25 + beverage.cost();
}
}
public
static
void
Main(string[] args)
{
Beverage espresso = new Espresso();
espresso = new SoyMilk(espresso);
Console.WriteLine("小张点了一杯:" + espresso.getDescription() + " 咖啡, 价格是:" + espresso.cost() + " RMB");
Console.ReadLine();
}
可以看出,除了饮料名称之外,代码都是一样的,下面是运行结果
和上面Java的结果对比确实不一样,下面把C#中的Beverage和CondimentDecorator改一下
把Beverage的getDescription方法写成虚方法
public
virtual
string
getDescription()
{
return description;
}
然后把CondimentDecorator的加上override
public
abstract
override
string
getDescription();
下面是运行结果
这样就正常了,是不是很神奇
来分析一下Java中执行步骤
Beverage beverage1 = new Latte(); //父类实例化Latte
beverage1 = new Mocha(beverage1); //Latte作为参数实例化Mocha//beverage1getDescription首先调用Mocha中的getDescription方法,然后再调用Latte里面的getDescription方法(隐式继承了父类)
beverage1.getDescription();
一直搞不懂C#中这样到底是怎么执行的,有了解的请给我留言,万分感谢
原文:http://blog.csdn.net/xiaoyiyz/article/details/46674385
内容总结
以上是互联网集市为您收集整理的大话设计模式-装饰者模式C#与Java对比存在的问题全部内容,希望文章能够帮你解决大话设计模式-装饰者模式C#与Java对比存在的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。