设计模式之代理模式

代理模式简单理解就是在不改变原业务代码的基础上做增强功能。

模拟使用场景:假如别人写了一个支付的功能,现在领导要我在支付前加一个安全检查的功能,并且在支付后发送短信。而别人写的支付功能完好,我不想改里面的任何东西。咋搞。这就可以用到代理模式了。

假如说这就是别人的支付代码

package com.px.eleven.system.service;

import cn.hutool.core.lang.Console;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;


@Service
public class PayServiceImpl implements IPayService {
    @Override
    public boolean pay(String account, BigDecimal amount) {
        Console.log("向"+account+"账号汇款"+amount+"元");
        return true;
    }
}

我要做的就是创建一个代理类,内容如下:

package com.px.eleven.system.listen;

import cn.hutool.core.lang.Console;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;


@Component
public class PayProxy {

    public Object createProxy(Object proxiedObject) {
        DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject);
        Class<?>[] interfaces = proxiedObject.getClass().getInterfaces();
        return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);
    }

    private class DynamicProxyHandler implements InvocationHandler {
        private Object proxiedObject;

        public DynamicProxyHandler(Object proxiedObject) {
            this.proxiedObject = proxiedObject;
        }


        public void before(){
            Console.log("进入支付前 安全检查,账户校验中");
        }

        public void after(){
            Console.log("发送短息");
        }


        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            before();
            Object result = method.invoke(proxiedObject, args);
            after();
            return result;
        }
    }

}

调用方式:

package com.px.eleven;

import com.px.eleven.system.listen.PayProxy;
import com.px.eleven.system.service.IPayService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.junit.runner.RunWith;

import java.math.BigDecimal;

@SpringBootTest
@RunWith(SpringRunner.class)
public class ElevenApplicationTests {

    @Autowired
    private IPayService payService;

    @Test
    public void testObEvent() {
        PayProxy payProxy =new PayProxy();
        IPayService proxy = (IPayService) payProxy.createProxy(payService);
        proxy.pay("6227XXXXXXXXXXXXX", BigDecimal.valueOf(500));

    }

}

这样就可以在原支付功能的基础上增加一些额外的功能了。不过现在这些功能都可以直接使用spring的aop功能实现了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值