- 装饰器模式(Decorator)
优点:
- 比静态继承更加灵活;
- 接口和被装饰的类保持一致,对Client无感 ;使用起来就像没有修饰易用性
- 可以产生叠加效果; 可以重复修饰一个对象,也可以使用不同的装饰器修饰相同的对象,产生叠加效果
- 可以作为AOP的简单实现,在调用被修饰对象之前可以调用其他功能
缺点:
1.产生许多的小对象
2.对象的功能和修饰类相关,不易排错
3.特别需要注意覆写equals()和HashCode()
必要条件
1.被修饰class的最好抽象一个接口,由修饰类和被修饰类共同实现;(强迫被实现被修饰类的和修饰类统一接口)
2.修饰类中存放被修饰类的接口成员变量;(方便替换被修饰的类,和被修饰类的方法的调用)
由被装饰类抽象出的接口
package demo.spring.boot.demospringboot;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 被修饰类抽象出的接口
*/
interface IBeDecoatorred {
void execute(String param);
IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred);
}
/**
* 被修饰类的实现
*/
class IBeDecoatorredImpl implements IBeDecoatorred {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void execute(String param) {
logger.info("execute:{}", param);
}
@Override
public IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred) {
return null;
}
}
/**
* 代理class1 -> 检查参数
*/
class DecoratorModel1 implements IBeDecoatorred {
/**
* 被修饰的对象
*/
private IBeDecoatorred iBeDecoatorred;
@Override
public IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred) {
this.iBeDecoatorred = iBeDecoatorred;
return this;
}
@Override
public void execute(String param) {
if (StringUtils.isNotBlank(param)) {
iBeDecoatorred.execute(param);
}
}
}
/**
* 代理class1 -> 调用其他逻辑
*/
class DecoratorModel2 implements IBeDecoatorred {
private IBeDecoatorred iBeDecoatorred;
@Override
public IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred) {
this.iBeDecoatorred = iBeDecoatorred;
return this;
}
/**
* 被修饰的方法 --> 和被修饰类的方法保持一致 -> 对Client无感
*/
@Override
public void execute(String param) {
this.before();
this.iBeDecoatorred.execute(param);
this.after();
}
//调用前处理逻辑
private void before() {
//to do something before ...
}
private void after() {
// to do something after ...
}
}
public class Decorator {
@Test
public void test() {
IBeDecoatorred iBeDecoatorred = new IBeDecoatorredImpl();
//model1代理iBeDecoatorred
IBeDecoatorred model1 = new DecoratorModel1().setiBeDecoatorred(iBeDecoatorred);
//model2代理model1 -> 叠加代理
IBeDecoatorred model2 = new DecoratorModel2().setiBeDecoatorred(model1);
model2.execute("param");
}
}