更改对象的值';在java中使用decorator模式的s变量?

更改对象的值';在java中使用decorator模式的s变量?,java,design-patterns,decorator,Java,Design Patterns,Decorator,我有一个程序,它使用生成器模式来构建ID对象。我不确定Builder模式的实现是否正确。但是,这个程序可以创建一个ID对象。一旦创建了对象,我想实现Decorator模式来为我的对象添加功能 这是我的身份证等级 public class ID implements IID { int width; int height; String name; String idnumber; boolean border = false; String bor

我有一个程序,它使用生成器模式来构建ID对象。我不确定Builder模式的实现是否正确。但是,这个程序可以创建一个ID对象。一旦创建了对象,我想实现Decorator模式来为我的对象添加功能

这是我的身份证等级

public class ID implements IID {
    int width;
    int height;
    String name;
    String idnumber;
    boolean border = false;
    String borderColor;

    public int getWidth() {return this.width;}
    public int getHeight() {return this.height;}
    public String getName() {return this.name;}
    public String getIDNumber() {return this.idnumber;}
    public boolean isBordered() {return border;}
    public String getBorderColor() {return borderColor;}
    @Override
    public void addBorder() {
        this.border = true;
    }
}
boolean border
String borderColor
isBordered()
getBorderColor()
addBorder()
用于装饰图案

这是接口
IID

public interface IID {
    void addBorder();
}
这是装修工

public abstract class IDDecorator implements IID {
    protected ID decoratedID;
    public IDDecorator(ID decoratedID) {
        this.decoratedID = decoratedID;
    }
    public void addBorder() {
        decoratedID.addBorder();
    } 
}
public class GrayIDDecorator extends IDDecorator {
    public GrayIDDecorator(ID decoratedID) {
        super(decoratedID);
    }
    @Override
    public void addBorder() {
        decoratedID.addBorder();
        setGrayBorder(decoratedID);
    }
    private void setGrayBorder(ID decoratedID) {
        decoratedID.borderColor="Gray";
    }
}
这是混凝土装饰工

public abstract class IDDecorator implements IID {
    protected ID decoratedID;
    public IDDecorator(ID decoratedID) {
        this.decoratedID = decoratedID;
    }
    public void addBorder() {
        decoratedID.addBorder();
    } 
}
public class GrayIDDecorator extends IDDecorator {
    public GrayIDDecorator(ID decoratedID) {
        super(decoratedID);
    }
    @Override
    public void addBorder() {
        decoratedID.addBorder();
        setGrayBorder(decoratedID);
    }
    private void setGrayBorder(ID decoratedID) {
        decoratedID.borderColor="Gray";
    }
}
我还想知道
super()
在这个具体的装饰器中有什么用途。什么是
super()

这是主课

...
public static void main(String[] args) {
    ...
   IDBuilderDirector idd = new IDBuilderDirector();
    ...
   ID id = idd.construct(roleD, idnumber, fname, lname);
    ...
   IID grayID = new GrayIDDecorator(id);
   id.addBorder();
   if (id.isBordered()) {
       System.out.println("Border: "+id.getBorderColor());
   } else {
       System.out.println("Border: None");
   }
}
IDBuilderDirector
和相关方法用于构建器模式

在主类中,我使用了
GrayIDDecorator
。程序执行后,我现在有了带边框的ID。但是为什么我不能更改ID的
borderColor
的值呢?如果调用
id.getBorderColor()
,它将返回
null

另外,我想知道我的程序中装饰器模式的实现是否正确

这是我下面关于装饰图案的链接。

super(…)
正在调用超类的构造函数。那里没有构建器模式。您的教程实现它有点错误。请参阅及其示例-抽象装饰器的要点是对其子类隐藏包装的项,以便它们可以像在常规类层次结构中那样调用
super
。如果你不使用它,就完全跳过抽象的部分。最后必须使用
grayID.addBorder()
。装饰的对象将替换未装饰的对象。这有点像一辆汽车builder@john,是的,我没有在代码中包含生成器模式。。