设计模式-代理模式

在这里插入图片描述
在这里插入图片描述
静态代理(Static proxy)

public interface IHello {
    public void hello(String name);
}

/**
 * 定义原有的不能修改的业务类,
 * 现在的任务:在不修改此类的前提下,完成打印日志等其他事情
 */
public class HelloStaticProxy implements IHello {
    @Override
    public void hello(String name) {
        System.out.println("hello=="+name);
    }
}

/**
 * 静态代理类
 * 静态代理,需要为被代理对象和方法实现撰写特定的代理对象
 */
public class PrintLogStaticProxy implements IHello {

    Logger logger = LoggerFactory.getLogger(PrintLogStaticProxy.class);

    private IHello helloObject;
    //有参数的构造方法,将参数传递给IHello,然后用helloObject,调用之前的方法,
    //
    public PrintLogStaticProxy(IHello helloObject){
        this.helloObject=helloObject;
    }
    //在重写的hello方法前面实现,前后打印日志的功能
    @Override
    public void hello(String name) {
        logger.info("hello"+name+"方法开始启动");
        helloObject.hello(name);
        logger.info("hello"+name+"方法执行完毕");
    }
}
public class TestStaticProxy {
    public static void main(String[] args) {
        //不修改原有的类的基础上,修改调用类的地方,使其能加上打印日志等其他功能
        IHello proxy=new PrintLogStaticProxy(new HelloStaticProxy());
        proxy.hello("sunyuhua");
    }
}

动态代理(Dynamic proxy)


public class PrintLogDecimalProxy implements InvocationHandler {

    Logger logger=LoggerFactory.getLogger(PrintLogDecimalProxy.class);

    private Object delegate;

    public Object bind(Object delegate){
        this.delegate=delegate;
        return Proxy.newProxyInstance( delegate.getClass().getClassLoader(),
                delegate.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=null;
        try {
            logger.info("方法调用开始");
            result = method.invoke(delegate, args);
            logger.info("方法调用结束");
        } catch (Exception e){
            logger.info(e.toString());
        }
        return result;
    }
}


public class TestDecimalProxy {

    public static void main(String[] args) {

        PrintLogDecimalProxy printLogDecimalProxy=new PrintLogDecimalProxy();
        IHello hello=(IHello)printLogDecimalProxy.bind(new HelloStaticProxy());
        hello.hello("sunyuhua??");
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值