Do *_*anh 5 java design-patterns decorator
我正在读"傻瓜设计模式".我阅读并练习了装饰模式.使用Decorator Pattern,我们可以用任何东西装饰一个对象.现在,我想在装饰之前删除装饰对象.我已经通过ArrayList解决了这个问题,但我仍觉得它不好.你能告诉我如何删除装饰物吗?什么是更好的方式?
这是我的方式:
Computer.java
public class Computer {
public Computer() {
}
public String description() {
return "computer";
}
}
Run Code Online (Sandbox Code Playgroud)
ComponentDecorator.java
public abstract class ComponentDecorator extends Computer {
@Override
public abstract String description();
}
Run Code Online (Sandbox Code Playgroud)
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";
}
}
Run Code Online (Sandbox Code Playgroud)
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";
}
}
Run Code Online (Sandbox Code Playgroud)
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";
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
一种更好的方法是将"removeDecorator"方法添加到ComponentDecorator类.
public abstract class ComponentDecorator {
private ComponentDecorator subject;
public ComponentDecorator(ComponentDecorator subject) {
this.subject = subject;
}
@Override
public abstract String description();
}
public void removeDecorator(ComponentDecorator toRemove) {
if (subject == null) {
return;
} else if (subject.equals(toRemove)) {
subject = subject.getSubject();
} else {
subject.removeDecorator(toRemove);
}
}
public ComponentDecorator getSubject() {
return subject;
}
// Computer
public class Computer extends ComponentDecorator{
public Computer() {
super(null);
}
public String description() {
return "computer";
}
// CD
public class CD extends ComponentDecorator {
public CD(ComponentDecorator computer) {
super(computer);
}
@Override
public String description() {
return getSubject().description() + " and a CD";
}
}
// main
public static void main(String[] args) {
ComponentDecorator penIII = new Computer();
penIII = new CD(penIII);
penIII = new Monitor(penIII);
System.out.println(penIII.description());
}
Run Code Online (Sandbox Code Playgroud)
}
如果您没有要删除的装饰器的引用,则可以创建另一个类而不是类.
但是,您需要将装饰对象设置为"ComponentDecorator"而不是"Computer".我建议让Computer类扩展ComponentDecorator而不是相反.
小智 1
我怀疑我误解了你的问题,但是为了从装饰器中获取装饰的(内部)对象,你只需向装饰器添加一个 get 方法即可。添加
public abstract Computer getDecorated();
到 ComponentDecorator 和
public Computer getDecorated(){return computer;}
每个子类(CD、监视器……)。这就是您要找的吗?
| 归档时间: |
|
| 查看次数: |
4855 次 |
| 最近记录: |