interface
Component {
void method();
}
class
Coffee
implements
Component {
@Override
public
void method() {
System.out.println(
"倒入咖啡"
);
}
}
class
Decorator
implements
Component {
public
Component comp;
public
Decorator(Component comp) {
this.comp = comp;
}
@Override
public
void method() {
comp.method();
}
}
class
ConcreteDecorateA
extends
Decorator {
public
Component comp;
public
ConcreteDecorateA(Component comp) {
super(comp);
this.comp = comp;
}
public
void method1() {
System.out.println(
"倒入牛奶"
);
}
public
void method2() {
System.out.println(
"加入糖 "
);
}
public
void method() {
super.method();
method1();
method2();
}
}
class
ConcreteDecorateB
extends
Decorator {
public
Component comp;
public
ConcreteDecorateB(Component comp) {
super(comp);
this.comp = comp;
}
public
void method1() {
System.out.println(
"加入巧克力"
);
}
public
void method() {
super.method();
method1();
}
}
public
class
TestDecoratePattern {
public
static
void main(String[] args) {
Component comp =
new
Coffee();
comp.method();
System.out.println(
"--------------------------------------------------"
);
Component comp1 =
new
ConcreteDecorateA(comp);
comp1.method();
System.out.println(
"--------------------------------------------------"
);
Component comp2 =
new
ConcreteDecorateB(comp1);
comp2.method();
System.out.println(
"--------------------------------------------------"
);
Component comp3 =
new
ConcreteDecorateB(
new
ConcreteDecorateA(
new
Coffee()));
comp3.method();
System.out.println(
"--------------------------------------------------"
);
Component comp4 =
new
ConcreteDecorateA(
new
ConcreteDecorateB(
new
Coffee()));
comp4.method();
}
}