装饰模型传递不了component
代码
Component
public abstract class Component {
public String FilePath;
public abstract String operation();}
ConcreteComponent
public class ConcreteComponent extends Component{
public ConcreteComponent(String FilePath) {
this.FilePath = FilePath;
// TODO Auto-generated constructor stub
}
Decorator
public abstract class Decorator extends Component {
public Component c;
public Decorator(Component c) {
// TODO Auto-generated constructor stub
this.c = c;
}
@Override
public String operation() {
// TODO Auto-generated method stub
return "";
}
}
Bugfix
public class bugfix extends Decorator {
public bugfix(Component c) {
// TODO Auto-generated constructor stub
super(c);
}
public String operation()
{
String done = super.operation();
//to do here
return done + "bugfix";
}
}
BankEnhanced
public class BankEnhanced extends Decorator{
public BankEnhanced(Component c) {
// TODO Auto-generated constructor stub
super(c);
}
public String operation()
{
String done = super.operation();
//todo here
return done + "enhanced";
}
}
main
String strFilePath = txtFilePath.getText();
Component c = new ConcreteComponent(strFilePath);
Decorator d = new bugfix(c);
if(chkBankEnhanced.isSelected())
{
System.out.println("Enhanced");
Decorator d = new BankEnhanced(d);
}
d.operation();
当chkBankEnhanced.isSelected()true,d.c.FilePath 就是null.
我没看出来哪里有问题,谢谢大家指教了,谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
包裹形式是
c = new bugfix(c);
d.c.FilePath当然是null,因为d变成BankEnhanced类型,它的d.c是bugfix类型,而不是ConcreteComponent类型。bugfix类型的FilePath 从来都没有被赋值过,所以当然等于null。
component都被正确传递了,没有被传递的是FilePath,FilePath和component是两个不同的field,不相干。在ConcreteComponent类型构造方法中有this.FilePath = FilePath;所以能传递FilePath,而bugfix类型及其基类Decorator没有传递FilePath。
你只要在bugfix或者Decorator的构造器中加入this.FilePath = FilePath;就可以让FilePath传递过来。