以下是2006年程序员考试的下午第8题,根据标准答案抄了一遍,却不能给出和标准答案一致的输出结果,请各位帮忙看看。
标准答案要求的输出结果:
这是票据抬头
这是票据正文
这是票据脚注
-----------------------------------
这是票据抬头
这是票据脚注public class Main
{
public static void main(String args[])
{
Decorator T=new HeadDecorator(new FootDecorator(new SalesTicket()));//在试卷上的原文为T=new HeadDecorator(new FootDecorator(new SalesTicket()));,没有给T指明数据类型,为了通过编译加上了Decorator
T.printTicket();
System.out.println("-----------------------------------");
T=new FootDecorator(new HeadDecorator(null));
T.printTicket();
}
}
//main()中的T=new HeadDecorator(new FootDecorator(new SalesTicket()));和T=new FootDecorator(new HeadDecorator(null));是试卷上的标准答案
//以下的类名SalesTicket、Decorator、HeadDecorator、FootDecorator均有public限制符,为了通过编译去掉了public
class SalesTicket
{
public void printTicket()
{
System.out.println("这是票据正文");
}
}class Decorator extends SalesTicket
{
SalesTicket Ticket;
public Decorator(SalesTicket t)
{
Ticket=t;
}
public void printTicket()
{
if(Ticket!=null)
{
Ticket.printTicket();
}
}
}class HeadDecorator extends Decorator
{
public HeadDecorator(SalesTicket t)
{
super(t);
}
public void printTicket()
{
System.out.println("这是票据抬头");
super.printTicket();
}
}class FootDecorator extends Decorator
{
public FootDecorator(SalesTicket t)
{
super(t);
}
public void printTicker()
{
super.printTicket();
System.out.println("这是票据脚注");
}
}
标准答案要求的输出结果:
这是票据抬头
这是票据正文
这是票据脚注
-----------------------------------
这是票据抬头
这是票据脚注public class Main
{
public static void main(String args[])
{
Decorator T=new HeadDecorator(new FootDecorator(new SalesTicket()));//在试卷上的原文为T=new HeadDecorator(new FootDecorator(new SalesTicket()));,没有给T指明数据类型,为了通过编译加上了Decorator
T.printTicket();
System.out.println("-----------------------------------");
T=new FootDecorator(new HeadDecorator(null));
T.printTicket();
}
}
//main()中的T=new HeadDecorator(new FootDecorator(new SalesTicket()));和T=new FootDecorator(new HeadDecorator(null));是试卷上的标准答案
//以下的类名SalesTicket、Decorator、HeadDecorator、FootDecorator均有public限制符,为了通过编译去掉了public
class SalesTicket
{
public void printTicket()
{
System.out.println("这是票据正文");
}
}class Decorator extends SalesTicket
{
SalesTicket Ticket;
public Decorator(SalesTicket t)
{
Ticket=t;
}
public void printTicket()
{
if(Ticket!=null)
{
Ticket.printTicket();
}
}
}class HeadDecorator extends Decorator
{
public HeadDecorator(SalesTicket t)
{
super(t);
}
public void printTicket()
{
System.out.println("这是票据抬头");
super.printTicket();
}
}class FootDecorator extends Decorator
{
public FootDecorator(SalesTicket t)
{
super(t);
}
public void printTicker()
{
super.printTicket();
System.out.println("这是票据脚注");
}
}
Decorator T=new HeadDecorator(new FootDecorator(new SalesTicket()));
FootDecorator构造函数的参数是SalesTicket,打印了“这是票据正文”和("这是票据脚注"),FootDecorator作为参数传给HeadDecorator,执行了System.out.println("这是票据抬头"); 以后就是打印了“这是票据正文”和("这是票据脚注")。
T=new FootDecorator(new HeadDecorator(null));
给HeadDecorator构造函数的参数是NULL,所以没有打印“这是票据正文”。在FootDecorator构造函数中引入的是HeadDecorator,所以执行了HeadDecorator的打印函数,然后执行System.out.println("这是票据脚注"); 如果有异议可以继续讨论。