装饰模式


所谓装饰模式就是在不改变原先功能代码的前提下为已有功能动态地添加新功能,装饰类和被装饰类之间无耦合,用起来十分灵活,可以扩展或撤销功能,打个比方你买个面包可以要包装袋也可以不要,就是这么简单

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

可见装饰模式用起来十分方便,想加就加,符合面向扩展开放,面向修改关闭的设计原则