我在閱讀「傻瓜設計模式」。我閱讀並練習裝飾模式。使用裝飾模式,我們可以用任何東西裝飾物體。現在,我想在裝飾之前刪除裝飾對象。我通過ArrayList解決了這個問題,但我仍然覺得它不好。你能告訴我如何刪除裝飾對象嗎?什麼是更好的方法?如何從裝飾模式中刪除裝飾對象Java中的模式
這是我的方式:
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;
}
}
對不起,我不擅長英語。這意味着我裝飾一個對象,我想刪除之前已裝飾的對象。例如:我有一臺電腦,然後將它添加到硬盤,屏幕和CD驅動器。但過了一會兒,我取下了CD驅動器,而我的電腦只有顯示器和硬盤驅動器。設備隨機刪除和選項。 我正在尋找這個問題的最佳解決方案 –
感謝您的答案,但我不想要裝飾對象。當我刪除裝飾器之前,我想獲取裝飾對象。 公共計算機getDecorated(){回報計算機;} 該方法返回一個裝飾物,這是沒有必要的,因爲構造函數是已經在做了 –
裝飾對象/去除裝飾對象...你能告訴我一個更好的方法是什麼? –