装饰模式
所谓装饰模式就是在不改变原先功能代码的前提下为已有功能动态地添加新功能,装饰类和被装饰类之间无耦合,用起来十分灵活,可以扩展或撤销功能,打个比方你买个面包可以要包装袋也可以不要,就是这么简单
IUser.java
public interface IUser {
String WhoAreYou();
}
A.java
public class A implements IUser {
private String name;
public A(String name) {
this.name = name;
}
@Override
public String WhoAreYou() {
return this.name;
}
}
B.java
public class B implements IUser {
private String name;
public B(String name) {
this.name = name;
}
@Override
public String WhoAreYou() {
return this.name;
}
}
AbstractDecorator.java
public abstract class AbstractDecorator implements IUser{
private IUser user;
AbstractDecorator(IUser user){
this.user = user;
}
@Override
public String WhoAreYou(){
return user.WhoAreYou();
}
}
SpecificDecorator.java
public class SpecificDecorator extends AbstractDecorator {
private SpecificDecorator sd;
SpecificDecorator(IUser user) {
super(user);
}
@Override
public String WhoAreYou(){
setDecoratorProperty(sd);
return super.WhoAreYou();
}
private void setDecoratorProperty(SpecificDecorator sd){
System.out.println("this is a decorator");
}
}
TestDecorator.java
public class TestDecorator {
public static void main(String[] args) {
IUser A = new A("zs");
SpecificDecorator sd = new SpecificDecorator(A);
System.out.println(sd.WhoAreYou());
System.out.println("---贫富分割线---");
IUser B = new B("ls");
System.out.println(B.WhoAreYou());
}
}
Run result
this is a decorator
zs
---贫富分割线---
ls
可见装饰模式用起来十分方便,想加就加,符合面向扩展开放,面向修改关闭的设计原则