装饰者模式/包装模式是指在不改变原有对象基础上,将功能附加到对象上。提供了比继承更有弹性的替代方案。

装饰者模型核心是不改动原先业务内容,但又给原来业务增加额外职责东西。

 

装饰者模式框架图:

原先主业务接口以及实现类

修饰者基类 implements InterfaceComponent

修饰者具体实现类

 

现有如下业务需求:

原有业务逻辑对数据进行处理;后续随着业务拓展,需要对原来业务新增数据发送监控功能以及error日志存储功能。基本设计思路是可以在原来业务类中新增这两个方法,可是这两个方法只是配合监控的非核心逻辑,所以这里可以采用装饰着模式在不改动核心业务逻辑前提下新建这两个方法

 

Business Interface:
public interface IDataProcess {
    void dataProcess();
}

Business Service:
public class DataProcess implements IDataProcess{
    @Override
    public void dataProcess() {
        System.out.println("this is main business process");
    }
}

BaseDecorate
public class BaseDecorate implements IDataProcess{
    IDataProcess dataProcess;
    public BaseDecorate(IDataProcess dataProcess){
        this.dataProcess=dataProcess;
    }
    @Override
    public void dataProcess() {
        dataProcess.dataProcess();
        System.out.println("this is base Decorate");
    }
}

SendMessageDecorate
public class SendMessageDecorate extends BaseDecorate{
    public SendMessageDecorate(IDataProcess dataProcess) {
        super(dataProcess);
    }
    @Override
    public void dataProcess(){
        super.dataProcess();
        sendMonitorMessage();

    }
    private void sendMonitorMessage(){
        System.out.println("this is sendMessageDecorate logic that using to send monitor message");
    }

}

ErrorLogStoreDecorate
public class LogStoredDecorate extends BaseDecorate {
    public LogStoredDecorate(IDataProcess dataProcess) {
        super(dataProcess);
    }
    @Override
    public void dataProcess(){
        super.dataProcess();
        storedLog();
    }
    private void storedLog(){
        System.out.println("this is logStore logic that using to store message");
    }

}


Controller:

@RestController
@RequestMapping
public class DecorateController {

    @Autowired
    private IDataProcess dataProcess;
    @RequestMapping("decorate")
    public void SendMessageDecorate(){
        BaseDecorate baseDecorate=new BaseDecorate(dataProcess); //基本包装类
        baseDecorate.dataProcess();
    }
    @RequestMapping("decorate1")
    public void decorateTest1(){
        SendMessageDecorate sendMessageDecorate=new SendMessageDecorate(dataProcess); //基本包装类基础上增加发邮件
        sendMessageDecorate.dataProcess();
    }

}

 

posted on 2023-03-07 13:44  colorfulworld  阅读(8)  评论(0编辑  收藏  举报