I'm reading "Design Pattern for Dummies". I read and practiced Decorator Pattern. With Decorator Pattern, we can decorate an object with anything. Now, I want to remove decorated object before decorated.I have solved this problem by an ArrayList but I still feel it's not good. Can you tell me how to remove a decorated object? And what is a better way?
this is my way:
Computer.java
public class Computer {
    public Computer() {
    }
    public String description() {
        return "computer";
    }
}
ComponentDecorator.java
public abstract class ComponentDecorator extends Computer {
    @Override
    public abstract String description();
}
CD.java
public class CD extends ComponentDecorator {
    private Computer computer;
    public CD() {
    }
    public CD(Computer computer) {
        this.computer = computer;
    }
    @Override
    public String description() {
        return computer.description() + " and a CD";
    }
}
Disk.java
public class Disk extends ComponentDecorator {
    private Computer computer;
    public Disk() {
    }
    public Disk(Computer c) {
        computer = c;
    }
    @Override
    public String description() {
        return computer.description() + " and a disk";
    }
}
Monitor.java
public class Monitor extends ComponentDecorator {
    private Computer computer;
    public Monitor() {
    }
    public Monitor(Computer computer) {
        this.computer = computer;
    }
    @Override
    public String description() {
        return computer.description() + " and a monitor";
    }
}
Main.java
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
    static ArrayList<ComponentDecorator> list = new ArrayList<>();
    public static void main(String[] args) {
        addComponent(new CD(), new Disk(), new Monitor());
        System.out.println(list.size());
        Computer penIII = getComputer();
        removeComponent(new Monitor());
        penIII = getComputer();
        System.out.println(penIII.description());
    }
    private static void addComponent(ComponentDecorator... comp) {
        list.addAll(Arrays.asList(comp));
    }
    private static void removeComponent(ComponentDecorator comp) {
        for(ComponentDecorator c : list) {
            if(c.getClass() == comp.getClass()) {
                list.remove(list.indexOf(c));
                break;
            }
        }
    }
    private static Computer getComputer() {
        Computer c = new Computer();
        Class e;
        for(ComponentDecorator d : list) {
            e = d.getClass();
            try {
                c = (Computer) e.getConstructor(new Class[]{Computer.class}).newInstance(c);
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }
        return c;
    }
}