生活中有很多例子是间接来控制和访问的,比如你找一个人不自己亲自去,而是让别人代替去做这就是最简单的代理模式,是一种间接通信的例子,对象间的间接通信也同样是面向对象设计中的一条重要的“审美观”。间接通信可以让对象间耦合性降低,以及易于复用的架构设计。
间接控制对象的交互是一个重要的编程思想,有很多的模式都体现了这种思想,比如装饰模式、适配器模式、代理模式,都是通过间接的方式实现某一目的。
这里主要介绍一下代理模式,无论是在现实生活中还是计算机技术中用到代理的地方非常多,主要分为静态代理和动态代理。
我们都做过机房收费系统就那这个系统来举例子,这个系统中有对用户操作的用户接口IUser,以及实现了这个接口的类UserImp,Java代码如下。
- <span style="font-size:18px;">/**
- * 用户表接口
- * @author LLS
- *
- */
- public interface IUser
- {
- //添加用户
- void addUser();
- //删除用户
- void delUser();
- }</span>
用户实现类
- <span style="font-size:18px;">/**
- * 实现用户接口类
- * @author LLS
- *
- */
- public class UserImpl implements IUser
- {
- public void addUser() {
- // 添加用户代码
- }
- public void delUser() {
- // 删除用户代码
- }
- }</span>
在这个例子中,我们可能需要在添加用户或者删除用户的时候进行权限检查,符合权限的才能执行相关动作,否则不能执行,那么该如何修改代码才能更加贴切,而且在实际的编写过程中,虽然我们需要权限模块,但有时候为了更好地快速测试,我们常常希望暂时关闭权限模块,如何才能让这样的临时需求变得更加容易处理呢?我们现在使用代理模式来完成这样的任务,现在继续编写一个类叫 UserImplProxy.
用户代理类
- <span style="font-size:18px;">/**
- * 用户实现类的代理
- * @author LLS
- *
- */
- public class UserImplProxy implements IUser
- {
- //对用户实现类的引用
- private UserImpl userImpl;
- //添加用户
- public void addUser()
- {
- //调用添加之前进行权限验证
- preIdentify();
- if( userImpl == null )
- {
- userImpl = new UserImpl();
- }
- //调用源对象的添加
- userImpl.addUser();
- //添加完后,执行操作
- postIdentify();
- }
- public void delUser()
- {
- preIdentify();
- if( userImpl == null )
- {
- userImpl = new UserImpl();
- }
- userImpl.addUser();
- postIdentify();
- }
- //验证方法
- private void preIdentify()
- {
- System.out.println("添加之前验证代码!");
- }
- //验证
- private void postIdentify()
- {
- System.out.println("添加后执行操作");
- }
- }</span>
这样就可以很容易的实现权限验证功能,很灵活。
上面是静态代理模式,如果不知道被代理对象可以使用动态代理……更新中