当我们需要对某些既有的类做扩展的时候,又不希望在原有的业务逻辑上做更改。只是单独加一些处理。这个时候我们就可以采用装饰器模式。
下边是一个简单UML示例图:
定义一个Base接口
public interface Base {
void run();
}
A类实现Base接口,重写run方法。
public class A implements Base {
int x
=1;
int y
=2;
@Override
public void run() {
System
.out
.println("tun A:"+(x
+y
));
}
}
定义一个抽象类GoDecorater 实现Base接口,定义成员变量go,run()方法中调用go.run()方法。
public abstract class GoDecorater implements Base {
Base go
;
public GoDecorater(Base go
){
this.go
=go
;
}
@Override
public void run() {
go
.run();
}
}
CircleDecrater 类继承自GoDecorater 类,重写run()方法,调用super.run();再将我们扩展的业务逻辑写在里边。
public class CircleDecrater extends GoDecorater {
public CircleDecrater(Base go
) {
super(go
);
}
@Override
public void run() {
System
.out
.println("circle run start");
super.run();
System
.out
.println("circle run end");
}
}
MarathonDecrater 类做同样处理
public class MarathonDecrater extends GoDecorater {
public MarathonDecrater(Base go
) {
super(go
);
}
@Override
public void run() {
System
.out
.println("marathon run start");
super.run();
System
.out
.println("marathon run end");
}
}
main方法中进行简单测试,看看两种装饰器的效果。
public class MainTest {
public static void main(String
[] args
) {
A a
=new A();
a
.run();
System
.out
.println("-----------------");
CircleDecrater c
=new CircleDecrater(a
);
c
.run();
System
.out
.println("-----------------");
MarathonDecrater m
=new MarathonDecrater(a
);
m
.run();
System
.out
.println("-----------------");
}
}
执行效果: