使用java中的装饰器模式更改对象变量的值?

时间:2015-12-09 07:30:51

标签: java design-patterns decorator

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

这是我的ID类

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 borderString borderColorisBordered()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();
    } 
}

这是Concrete Decorator,

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及相关方法适用于Builder Pattern。

在主课程中,我使用了GrayIDDecorator。执行程序后,我现在有了带边框的ID。但为什么我无法更改ID borderColor的值?如果我致电id.getBorderColor(),它将返回null

另外,我想知道我程序中的Decorator模式的实现是否正确。

这是我关于Decorator Pattern的链接。 http://www.tutorialspoint.com/design_pattern/decorator_pattern.htm

0 个答案:

没有答案