设计模式6 ——代理模式

本文探讨了代理模式的定义,包括其作为访问控制手段的优点与缺点,以及在不同场景下的运用,如远程访问、资源节省和权限管理。还介绍了静态代理和动态代理的实现方法,并以UserService接口和UserServiceImpl为例进行了演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、代理模式的定义 

     Provide a surrogate or placeholder for another object to control access to it(其他对象提供一种代理以控制对这个对象的访问)。

二、代理模式的应用

1、代理模式的优点

(1)职责清晰。真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。

(2)高扩展性。具体主题角色是随时都会发生变化的,只要它实现了接口,不管它如何变化,都逃不脱接口,那我们的代理类完全就可以在不做任何修改的情况下使用。

(3)智能化。动态代理可以体现出来。

2、代理模式的缺点

(1) 代理模式会造成系统设计中类的数量增加。

(2)在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。

(3)增加了系统的复杂度

3、代理模式的使用场景

(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。

(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。

(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。

(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。

(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

 

 三、代理模式的写法

 


//Service接口
public interface UserService {

    void save();

    void delete();

    void update();

}



//Service实现
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        Log.e("====","新增用户");
    }

    @Override
    public void delete() {
        Log.e("====","删除用户");
    }

    @Override
    public void update() {
       Log.e("====","修改用户");
    }
}



/**
 * 静态代理类
 * 实现日志扩展功能
 *要求:
 *1)和目标(类)实现同样的接口
 *2)在静态代理类中传入目标对象实例,以便调用目标对象的方法
 *3)可以在静态代理类的方法中添加代理逻辑代码
 */
public class LogProxy implements UserService{

    //接收目标对象实例
    private UserService userService;

    //使用构造方法传入目标对象实例
    public LogProxy(UserService userService){
        this.userService = userService;
    }

    @Override
    public void save() {
      Log.e("====","before=====save");
        //调用目标对象的方法
        userService.save();
       Log.e("====","after=====save");
    }

    @Override
    public void delete() {
        Log.e("====","before=====save");
        //调用目标对象的方法
        userService.delete();
      Log.e("====","after=====save");
    }

    @Override
    public void update() {
       Log.e("====","before=====save");
        //调用目标对象的方法
        userService.update();
     Log.e("====","after=====save");
    }
}

动态代理 强制代理待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值