J2EE (九) 静态代理和动态代理--间接“美”

        生活中有很多例子是间接来控制和访问的,比如你找一个人不自己亲自去,而是让别人代替去做这就是最简单的代理模式,是一种间接通信的例子,对象间的间接通信也同样是面向对象设计中的一条重要的“审美观”。间接通信可以让对象间耦合性降低,以及易于复用的架构设计。

        间接控制对象的交互是一个重要的编程思想,有很多的模式都体现了这种思想,比如装饰模式、适配器模式、代理模式,都是通过间接的方式实现某一目的。

        这里主要介绍一下代理模式,无论是在现实生活中还是计算机技术中用到代理的地方非常多,主要分为静态代理和动态代理。

        我们都做过机房收费系统就那这个系统来举例子,这个系统中有对用户操作的用户接口IUser,以及实现了这个接口的类UserImp,Java代码如下。

/**
 * 用户表接口
 * @author LLS
 *
 */
public interface IUser
{
	  //添加用户
      void addUser();
      //删除用户
      void delUser();
}


        用户实现类

/**
 * 实现用户接口类
 * @author LLS
 *
 */
public class UserImpl implements IUser 
{

	public void addUser() {
		// 添加用户代码
	}
	
	public void delUser() {
		// 删除用户代码
	}
}

        

        在这个例子中,我们可能需要在添加用户或者删除用户的时候进行权限检查,符合权限的才能执行相关动作,否则不能执行,那么该如何修改代码才能更加贴切,而且在实际的编写过程中,虽然我们需要权限模块,但有时候为了更好地快速测试,我们常常希望暂时关闭权限模块,如何才能让这样的临时需求变得更加容易处理呢?我们现在使用代理模式来完成这样的任务,现在继续编写一个类叫 UserImplProxy.

 

    用户代理类

/**
 * 用户实现类的代理
 * @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("添加后执行操作");
    }
}

          这样就可以很容易的实现权限验证功能,很灵活。

          上面是静态代理模式,如果不知道被代理对象可以使用动态代理……更新中

 

 

posted @ 2013-07-22 18:56  坚固66  阅读(165)  评论(0编辑  收藏  举报