在日常开发过程中,往往会碰到需要对已有类的方法附加额外的功能但不破坏原有逻辑.(因为有可能这个类的方法被多处调用,而其中一处需要额外的功能).此时,我们就可以用到装饰着模式.
public class DecoratorPatternDemo {
public static void main(String[] args) {
System.out.println("包装前......");
IProgrammer juniorProgrammer = new JuniorProgrammer();
juniorProgrammer.showMe();
System.out.println("=================");
System.out.println("包装后......");
JuniorProgrammerWrapper juniorProgrammerWrapper = new JuniorProgrammerWrapper(juniorProgrammer);
juniorProgrammerWrapper.showMe();
}
}
interface IProgrammer{
void showMe();
}
/**
* 被装饰者
*/
class JuniorProgrammer implements IProgrammer{
@Override
public void showMe(){
System.out.println("精通增删改查");
}
}
/**
* 装饰者
*/
class JuniorProgrammerWrapper implements IProgrammer{
private IProgrammer iProgrammer;
public JuniorProgrammerWrapper(IProgrammer iProgrammer) {
this.iProgrammer = iProgrammer;
}
@Override
public void showMe() {
System.out.println("熟读spring源码,高并发问题不在话下");
//.....balabala.... 额外的功能
iProgrammer.showMe();
System.out.println("熟悉使用各种中间件,熟悉红黑树原理");
//.....balabala...额外的功能
}
}
输出:
包装前......
精通增删改查
=================
包装后......
熟读spring源码,高并发问题不在话下
精通增删改查
熟悉使用各种中间件,熟悉红黑树原理
JuniorProgrammer中的showMe可能被a,b,c三处调用,但是c需要在调用前后附加额外的功能(可能在以后会被d调用).
装饰者可以代替被装饰者,使被装饰者始终可以保持着功能单一.某些情况,比如对第三方jar的类,因为jar中的类是class文件,我们可以对其中的类进行包装,附加额外的功能.此时用装饰者模式再合适不过了.