AOP代理模式理解及使用

代理模式的定义

定义:给目标对象提供一个代理对象,并控制对目标对象的引用。
目的:1.通过代理对象,对原有的对象进行增强。2.通过引入代理对象的方式访问目标对象,简化目标对象给系统带来的复杂性。

1)静态代理模式类图

在这里插入图片描述

//接口
public interface InsertOp {
    void insertLog(String params);
}
//被代理对象
public class InserOpImp implements InsertOp {
    @Override
    public void insertLog(String params) {
        System.out.println("正在插入一条数据,参数为:" + params);
    }
}
//静态代理实现
public class StaticFactory implements InsertOp {
    InsertOp insertOp;

    public StaticFactory(InsertOp insertOp) {
        this.insertOp = insertOp;
    }

    @Override
    public void insertLog(String params) {
        dosomthingBefore();
        this.insertOp.insertLog(params);
        dosomethingAfter();
    }

    private void dosomthingBefore() {
        System.out.println("---------操作前--------");
    }

    private void dosomethingAfter() {
        System.out.println("---------操作后--------");
    }
}

public class Master {
    public static void main(String[] args) {
        //静态代理
        InsertOp insertOp =new InserOpImp();
        StaticFactory staticFactory = new StaticFactory(insertOp);
        staticFactory.insertLog("insert into user(user_id,user_name,sex) values(1,'lucy',1)");
    }
}


执行结果

---------操作前--------
正在插入一条数据,参数为:insert into user(user_id,user_name,sex) values(1,'lucy',1)
---------操作后--------

Process finished with exit code 0

静态代理模式搭建起来简单,但是却违反了开闭原则,因为如果要扩展就需要实现更多的接口类,扩展的接口多了就需要修改大量的代码,具有扩展能力差,维护性差的缺点,下面我们使用动态代理做这个事情

2)动态代理

在这里插入图片描述

//接口
public interface InsertOp {
    void insertLog(String params);
}
//被代理对象
public class InserOpImp implements InsertOp {
    @Override
    public void insertLog(String params) {
        System.out.println("正在插入一条数据,参数为:" + params);
    }
}
//代理实现类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LogFatory implements InvocationHandler {

    private Object handler;

    public Object getHandler() {
        return handler;
    }

    public void setHandler(Object handler) {
        this.handler = handler;
    }

    public Object getInstance() {
        return Proxy.newProxyInstance(handler.getClass().getClassLoader(), handler.getClass().getInterfaces(), this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        dosomthingBefore();
        Object ret = method.invoke(handler, args);
        dosomethingAfter();
        return ret;
    }

    private void dosomthingBefore() {
        System.out.println("---------操作前--------");
    }

    private void dosomethingAfter() {
        System.out.println("---------操作后--------");
    }
}

测试

    public static void main(String[] args) {

        InsertOp insertOp = new InserOpImp();
        LogFatory logFatory = new LogFatory();
        logFatory.setHandler(insertOp);
        //返回一个增强的对象
        InsertOp insertOp1 =(InsertOp) logFatory.getInstance();
        insertOp1.insertLog("insert into user(user_id,user_name,sex) values(1,'lucy',1)");
    }

执行结果

---------操作前--------
正在插入一条数据,参数为:insert into user(user_id,user_name,sex) values(1,'lucy',1)
---------操作后--------

Process finished with exit code 0

动态代理的方式通过多态的方式进行实例化,将具体的类传给代理类进行增强,有效的将具体实现类与代理类解耦,便于后期修改和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值