【无标题】

装饰器模式

有些时候,对一些已有的项目需要做一些增强的方法,但是又不能改变原有的项目结构,这个时候就可以用装饰器模式,我自己觉得装饰器模式有点像代理模式,不同在于一个在方法里面增强,一个在方法外且执行方法的前后增强,

模拟正常的代码:
创建一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值