测开笔记——学习java装饰器模式

需求

为老业务系统添加计算接口的执行时间

解决办法

  • 第一种解决: 使用模板设计模式来搞定
  • 第二种解决: 使用装饰器设计模式来解决
  • 第三种解决: 动态代理设计模式来搞定 (https://blog.csdn.net/qw4339829/article/details/102622860)
  • 第四种解决: 使用Spring AOP

业务代码

//**老业务接口**
public interface MsgService {
    String addMsg(String msg);
    String updateMsg(String msg);
    String delMsg(String msg);
    String queryMsg(String msg);
}
//**老业务实现类**
public class MsgServiceImpl implements MsgService {
    @Override
    public String addMsg(String msg) {
        System.out.println("addMsg : " + msg);
        return msg;
    }

    @Override
    public String updateMsg(String msg) {
        System.out.println("updata :" + msg);
        return msg;
    }

    @Override
    public String delMsg(String msg) {
        System.out.println("del :" + msg);
        return msg;
    }

    @Override
    public String queryMsg(String msg) {
        System.out.println("query :" + msg);
        return msg;
    }
}

装饰器模式解决

public class MsgServiceHandle implements MsgService {

    private MsgService msgService;
	
	// 传入的参数相当于 new MsgServiceImpl()
    public MsgServiceHandle(MsgService msgService) {
        this.msgService = msgService;
    }

    @Override
    public String addMsg(String msg) {
    	// 启动时间
        long start = System.currentTimeMillis();
        System.out.println("start...");
        
		// 执行业务代码 等于 new MsgServiceImpl().ddMsg(msg)
        String reps = msgService.addMsg(msg);
		
		// 结束时间
        long end = System.currentTimeMillis();
        System.out.println("end...");

        System.out.println("run time = " + (end - start));
        return reps;
    }

    @Override
    public String updateMsg(String msg) {
        return null;
    }

    @Override
    public String delMsg(String msg) {
        return null;
    }

    @Override
    public String queryMsg(String msg) {
        return null;
    }
}

Main

public class App {

    public static void main(String[] args) {
        // 装饰器模式实现
        MsgService msgService = new MsgServiceHandle(new MsgServiceImpl());
        msgService.addMsg("wow");
    }
}
start...
addMsg : wow
end...
run time = 0

总结

装饰器模式其实就是引入实现类的接口,然后在其装饰类上扩展新增的功能,然后调用对应实现类的方法,比如装饰类 addMsg方法里面调用实现类的addMsg方法。

对比

同一个需求对比
装饰器模式与动态代理: 动态代理只需要增加两个类(为了代码简洁,可以一个方法搞定),就可以处理需要相同功能的接口。
而装饰器模式需要给每个接口都要写一个装饰器类,比如有 InfoService ,OrderSerice 等多个接口,就需要写多个装饰器类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值