java-JAVA和C#执行HeadFirst装饰者模式的结果差异,求解?

问题描述

JAVA和C#执行HeadFirst装饰者模式的结果差异,求解?

JAVA版
//Beverage.java
public abstract class Beverage {
String description = "Unkown Beverage";

public String GetDescription(){
return description;
}

public abstract double Cost();
}
//CondimentDecorator.java
public abstract class CondimentDecorator extends Beverage {

public abstract String GetDescription();

}
//Espresso.java
public class Espresso extends Beverage {
public Espresso()
{
description = "Espresso";
}

public double Cost() {

return 1.99;
}

}
//HouseBlend .java
public class HouseBlend extends Beverage {

public double Cost() {
return .89;
}
public HouseBlend()
{
description = "House Blend Coffee";
}
}

//Mocha.java
public class Mocha extends CondimentDecorator {

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

public String GetDescription() {

return beverage.GetDescription() + ", Mocha";
}

public double Cost() {

return .20 + beverage.Cost();
}

}

//main.java

public class Main {

/**

  • @param args
    */
    public static void main(String[] args) {
    Beverage bv = new Espresso();
    System.out.println(bv.GetDescription() +" $"+bv.Cost());

Beverage bv2 = new HouseBlend();
bv2 = new Mocha(bv2);
System.out.println(bv2.GetDescription() +" $"+bv2.Cost());
}

}

运行结果
Espresso $1.99
House Blend Coffee, Mocha $1.09

##############################

C#版
//Beverage.cs
public abstract class Beverage
{
public string description = "Unkown Beverage";

public string GetDescription()
{
return description;
}

public abstract double Cost();
}

//CondimentDecorator.cs
public abstract class CondimentDecorator:Beverage
{
public abstract new string GetDescription();
}

//Espresso.cs
public class Espresso : Beverage
{
public Espresso()
{
description = "Espresso";
}
public override double Cost()
{
return 1.99;
}
}

//HouseBlend.cs
public class HouseBlend : Beverage
{
public HouseBlend()
{
description = "House Blend Coffee";
}
public override double Cost()
{
return .89;

}
}

//Mocha.cs
public class Mocha : CondimentDecorator
{
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}

public override double Cost()
{
return .20 + beverage.Cost();
}

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

Program.cs
class Program
{
static void Main(string[] args)
{
Beverage bv = new Espresso();
Console.WriteLine(bv.GetDescription() + " $"+bv.Cost());

Beverage bv2 = new HouseBlend();

bv2 = new Mocha(bv2);

Console.WriteLine(bv2.GetDescription() + " $" + bv2.Cost());
Console.ReadKey();
}
}
运行结果:
Espresso $1.99
Unkown Beverage $1.09

解决方案

public abstract new string GetDescription();
->
public abstract string GetDescription();

解决方案二:

java软件体系结构设计模式----装饰者
java装饰者模式
Java装饰者模式

时间: 2024-10-26 00:09:18

java-JAVA和C#执行HeadFirst装饰者模式的结果差异,求解?的相关文章

java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在写入一个字符时,Java虚拟机会将字符转为文件指定的编码(默认 是系统默认编码),在读取字符时,再将文件指定的编码转化为字符. 常见的码表如下: ASCII:           美国标准信息交换码.用一个字节的7位可以表示. ISO8859-1:   拉丁码表.欧洲码表,用一个字节的8位表示.又称

java 设计模式之装饰者模式 VS 代理模式详解

装饰者模式 简介 && Java 使用场景 UML && 代码实现 Android 源码场景 代理模式 简介 && Java 使用场景 UML && 代码实现 Android 源码场景 装饰者.代理模式异同 对比 总结 装饰者模式 简介 && Java 使用场景 Decorator模式(别名Wrapper):用户扩展功能,动态将职责附加到对象上.使用装饰者比使用继承更加灵活. 我们经常看到的I/O 处理类,实际上就使用到了装饰

装饰者模式(Decorator Pattern) Java的IO类的使用方法

Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decorator)的基类. 实现其他装饰者(decorator), 需要继承FilterInputStream类. 代码: /** * @time 2014年5月23日 */ package decorator.io; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream;

用命令行编译java并生成可执行的jar包

用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: package test; import java.awt.*; import javax.swing.*; //更多包的导入... class NotePadFrame extends JFrame { //主界面的设计... } //其他相关代码... public class CardLayo

为什么java不能执行编译后的.class文件呢?求解

问题描述 为什么java不能执行编译后的.class文件呢?求解 就是这个问题,谢谢 解决方案 javac是用来编译的,执行用 "java 类名" 解决方案二: 你先执行>java BeerAndWing2 再执行>javac BeerAndWing2.class 这样就可以了,java 是编译,javac 是执行 解决方案三: Java文件编译成功后的class文件无法执行cmd 执行java Class 文件使用cmd编译java文件成功生成class,但是不能执行 解

java装饰着模式问题,新手求助

问题描述 java装饰着模式问题,新手求助 本人新手,在java head first设计模式中装饰模式遇到个问题请教大家,问题就是设置饮料杯子的大小,根据杯子大小加上各自的价钱,写的代码如下,不知道为什么结果却不会根据设置的大小加上价钱?感觉应该SizeDecorator中的cost()方法有问题,但是又试不出来,求指点,谢谢 public abstract class Beverage { String description="Unknown Beverage"; String

Java 线程 实现 定时执行操作

问题描述 Java 线程 实现 定时执行操作 这是使用javafx做的一个界面:1.点击开始按钮能够自动向表格中添加一条记录 2.点击停止按钮能够停止添加,3.文本框内是每次添加的时间间隔. 请问在不用Timer 和TimerTask等util工具类 ,用线程怎么实现点击按钮来定时添加数据和停止添加功能 解决方案 这样的话,可以使用主线程和子线程,点击按钮控制主线程,开启子线程和中断子线程. 而子线程里面,检查中断标识,如果没有被中断,就自己每隔一段时间就执行数据添加的操作.如果被中断,线程ru

关于java界面中按钮执行事件的问题

问题描述 关于java界面中按钮执行事件的问题 我用JAVA在一个包中写了MultiThreadMatrix.java和Jiemian.java.MultiThreadMatrix.java是一个并行矩阵计算程序,怎么让Jiemian.java中的一个按钮b3,点击b3执行MultiThreadMatrix.java,并将结果输出在Jiemian.java的文本框中. MultiThreadMatrix.java的打印的结果是,先让你输入想建立的线程个数,然后输出每个线程计算哪一行. 下面是Mu

java for循环无法执行

问题描述 java for循环无法执行 public static void main(String[] args) { // TODO Auto-generated method stub Population population = new Population(3 10 30); population.initPopulation(); String[]gene; Individual [] pop; try { Class.forName(""com.microsoft.sq