装饰器模式
有些时候,对一些已有的项目需要做一些增强的方法,但是又不能改变原有的项目结构,这个时候就可以用装饰器模式,我自己觉得装饰器模式有点像代理模式,不同在于一个在方法里面增强,一个在方法外且执行方法的前后增强,
模拟正常的代码:
创建一个Service
public interface DecoratorService {
void action();
}
实现其方法
做演示就实现两个方法
@Service("testADecoratorServiceImpl")
public class TestADecoratorServiceImpl implements DecoratorService {
@Override
public void action() {
System.out.println("测试方法1");
}
}
@Service("testBDecoratorServiceImpl")
public class TestBDecoratorServiceImpl implements DecoratorService {
@Override
public void action() {
System.out.println("测试方法2");
}
}
调用controller
@RestController
@RequestMapping("/testController")
public class TestController {
@Autowired
@Qualifier("testBDecoratorServiceImpl")
private DecoratorService decoratorServiceB;
@Autowired
@Qualifier("testADecoratorServiceImpl")
private DecoratorService decoratorServiceA;
@GetMapping("test")
String testDecorator(){
decoratorServiceA.action();
decoratorServiceB.action();
return "123";
}
}
执行结果
继承一个装饰器Service,写一个增强类
public class AddDecorator implements DecoratorService {
private DecoratorService decoratorService;
public AddDecorator(DecoratorService decoratorService){
this.decoratorService = decoratorService;
}
@Override
public void action() {
System.out.println("增强前");
decoratorService.action();
System.out.println("增强后");
/*addAgine();*/
}
public void addAgine(){
System.out.println("再次增强");
}
}
在controller调用
@RequestMapping("/testController")
public class TestController {
@Autowired
@Qualifier("testBDecoratorServiceImpl")
private DecoratorService decoratorServiceB;
@Autowired
@Qualifier("testADecoratorServiceImpl")
private DecoratorService decoratorServiceA;
@GetMapping("test")
String testDecorator(){
AddDecorator addDecoratorA = new AddDecorator(new TestADecoratorServiceImpl());
addDecoratorA.action();
AddDecorator addDecoratorB = new AddDecorator(new TestBDecoratorServiceImpl());
addDecoratorB.action();
/*decoratorServiceA.action();
decoratorServiceB.action();*/
return "123";
}
}
执行结果
目前是已经增强了,如果还想再增加一些业务逻辑而且不侵入源代码的话,还可以在AddDecorator 添加方法
public class AddDecorator implements DecoratorService {
private DecoratorService decoratorService;
public AddDecorator(DecoratorService decoratorService){
this.decoratorService = decoratorService;
}
@Override
public void action() {
System.out.println("增强前");
decoratorService.action();
System.out.println("增强后");
//添加的方法
addAgine();
}
public void addAgine(){
System.out.println("再次增强");
}
}
执行后
@GetMapping("test")
String testDecorator(){
AddDecorator addDecoratorA = new AddDecorator(new TestADecoratorServiceImpl());
addDecoratorA.action();
/*AddDecorator addDecoratorB = new AddDecorator(new TestBDecoratorServiceImpl());
addDecoratorB.action();*/
/*decoratorServiceA.action();
decoratorServiceB.action();*/
return "123";
}
能看到装饰了一次,然后又装饰了一次,还有需求的话还可以再装o.o