结构型模式(代理模式)

Posted 伍妖捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式(代理模式)相关的知识,希望对你有一定的参考价值。

代理模式

对现有业务增强功能
下面以添加日志功能为例

静态代理

在这里插入图片描述

现有接口和实现类

public interface IUserService {
    void save();

    void delete();
}
public class UserService implements IUserService {
    @Override
    public void save() {
        System.out.println("保存用户逻辑");
    }

    @Override
    public void delete() {
        System.out.println("删除用户逻辑");
    }
}

改进,在原有的基础上添加日志功能,不使用代理模式,可以直接在对象的方法中添加日志即可

@Slf4j
public class UserService implements IUserService {
    @Override
    public void save() {
        log.warn("开始save用户");
        System.out.println("保存用户逻辑");
        log.warn("用户save成功");
    }

    @Override
    public void delete() {
        log.warn("开始delete用户");
        System.out.println("删除用户逻辑");
        log.warn("用户delete成功");
    }
}

接下来通过静态代理实现

@Data
@Slf4j
public class UserServiceProxy implements IUserService {
    private UserService userService;

    @Override
    public void save() {
        log.warn("开始save用户");
        userService.save();
        log.warn("用户save成功");
    }

    @Override
    public void delete() {
        log.warn("开始delete用户");
        userService.delete();
        log.warn("用户delete成功");
    }
}

客户端使用

public class Client {
    public static void main(String[] args) {
        UserServiceProxy userServiceProxy = new UserServiceProxy();
        userServiceProxy.setUserService(new UserService());
        userServiceProxy.save();
    }
}

在这里插入图片描述

动态代理

在类加载的过程中,动态生成代理类

JDK动态代理

基于接口的动态代理
创建代理处理类,主要是动态生成代理类,以及调用代理方法。

public interface IUserService {
    void save();

    void delete();
}
public class UserService implements IUserService {
    @Override
    public void save() {
        System.out.println("保存用户逻辑");
    }

    @Override
    public void delete() {
        System.out.println("删除用户逻辑");
    }
}
@Slf4j
public class ProxyInvocationHandler implements InvocationHandler {
    Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log.warn("开始{}用户", method.getName());
        Object obj = method.invoke(target, args);
        log.warn("用户{}成功", method.getName());
        return obj;
    }
}

客户端使用

public class Client {
    public static void main(String[] args) {
        UserService userService = new UserService();
        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        handler.setTarget(userService);
        IUserService proxy = (IUserService) handler.proxy();
        proxy.save();
    }
}

在这里插入图片描述

Cglib动态代理

以上是关于结构型模式(代理模式)的主要内容,如果未能解决你的问题,请参考以下文章

Python 设计模式 — 结构型模式 — 代理模式

[设计模式C++go]结构型模式:代理模式

[设计模式C++go]结构型模式:代理模式

[设计模式C++go]结构型模式:代理模式

设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计

设计模式结构型(代理模式桥接模式装饰者模式适配器模式)