zoukankan      html  css  js  c++  java
  • 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("添加后执行操作");
        }
    }

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

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

     

  • 相关阅读:
    电子商务标准体系RosettaNet与Microsoft BizTalk Accelerator for RosettaNet 无为而为
    sharepoint进行Unit Test的一个方案 无为而为
    微软VSTS的新功能:WebTest要点 无为而为
    IT部门的几种生存模式分析 无为而为
    一个人出现问题可能是道德问题,但是很多人都有相同的问题就一定不是道德问题。 无为而为
    意大利人有过关了,不过要面对东道主德国队未必会有这么容易 无为而为
    记一次阿里云OSS的STS授权访问
    得到应用程序所在路径
    反射 运用
    GetEnumerator用法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3206299.html
Copyright © 2011-2022 走看看