zoukankan      html  css  js  c++  java
  • 代理模式(静态代理)的通俗理解

    代理模式分为两种:静态代理和动态代理。

    首先不谈模式,举一个例子:

           有一队很美丽的妹子,她们都是训练有素的迎宾小姐。平时忙于训练再加上人脉与广告投入不多,生意并不好。于是她们的老大提议去找一个礼仪公司合作,请他们把迎宾的活儿包给她们来做。恰好在某个公司有个接待外宾的活动,该活动交给一个这个知名的礼仪公司负责,礼仪公司就通知了迎宾小姐。在外宾下车时就要乐队奏乐,走到公司门口时,迎宾小姐需要致以问候。现在来模拟一下这个情景。

    //相当于迎宾小姐(委托类)
    public class HelloWorld {
    	public void sayhello(){
    		System.out.println("Hello!");
    	}
    }
    
    //相当于这个礼仪公司(代理类)
    public class StaticProxy{
    	//持有了迎宾小姐的资源
    	private HelloWorld helloWorld = new HelloWorld();
    	//迎宾活动
    	public void sayhello() {
    		//自己的乐队奏乐
    		System.out.println("do  something....");
    		//迎宾小姐欢迎
    		helloWorld.sayhello();
    	}
    	
    	public static void main(String[] args) {
    		StaticProxy staticProxy = new StaticProxy();
    		staticProxy.sayhello();
    	}
    }

           可是事情进展的并不顺利,突然听说这些个外宾都会中文,而且其中的重量级人物很喜欢中国传统文化。于是该公司要求礼仪公司立即换掉迎宾小姐,请一队着汉服而且普通话好的来。幸好该队迎宾小姐都是狠角色,各种场面都能应付。

    于是我们做如下修改:

    //相当于迎宾小姐新阵容
    public class HelloWorld2 {
    	public void sayhello(){
    		System.out.println("您好!");
    	}
    }
    //相当于这个礼仪公司
    public class StaticProxy{
    	//持有了第二队迎宾小姐的资源
    	private HelloWorld2 helloWorld2 = new HelloWorld2();
    	//迎宾活动
    	public void sayhello() {
    		//自己的乐队奏乐
    		System.out.println("do  something....");
    		//迎宾小姐欢迎
    		helloWorld2.sayhello();
    	}
    	
    	public static void main(String[] args) {
    		StaticProxy staticProxy = new StaticProxy();
    		staticProxy.sayhello();
    	}
    }

    迎宾队伍的老大又想,这样太麻烦了,每次换来换去的折腾不起,倒不如我们再召些人马,加强多元化的训练,使自己的团队能应付各种场面,然后根据需求迅速做出响应。

    //专业迎宾团队
    public interface IHelloWorld {
    	//规定了做什么
    	public void sayhello();
    }
    //第一小队
    public class HelloWorldImpl implements IHelloWorld{
    	//照着规章去做     说英语
    	public void sayhello(){
    		System.out.println("Hello!");
    	}
    }
    
    //第二小队
    public class HelloWorldImpl2 implements IHelloWorld {
    	//同样是致欢迎   用标准普通话
    	@Override
    	public void sayhello() {
    		System.out.println("您好 !");
    	}
    }

    修改代理类:

    //相当于这个礼仪公司
    public class StaticProxy{
    	//持有了迎宾团队的资源
    	private IHelloWorld hello ;
      
    	public StaticProxy() {
    //招呼迎宾团队准备上场,具体派哪对视情况而定
    		hello = new HelloWorldImpl();
            //hello = new HelloWorldImpl2();
    	}
    
    	//迎宾活动
    	public void sayhello() {
    		//自己的乐队奏乐
    		System.out.println("do  something....");
    		//迎宾小姐欢迎
    		hello.sayhello();
    	}
    	
    	public static void main(String[] args) {
    		//该公司并不知道有迎宾团队的存在   它只和代理(礼仪公司)接触
    		StaticProxy staticProxy = new StaticProxy();
    		staticProxy.sayhello();
    	}
    	
    }

        修改后的代码可以说是一个静态代理了,设计模式提倡针对接口编程,而不是针对实现编程,这样可以灵活多变。最开始的代码可以说是一种代理,但不是一种模式,模式讲究的是良好的设计,如果进一步强调通用性和可扩展性,那就不得不提到JDKcglib的动态代理。


    从上面来总结一下静态代理:

        有些类由于自己功能有限,需要其他的类做一些工作来辅助完成某些功能,虽然这些辅助工作是必须的,但是委托类却不需要自己去做,一是他没有资源,二是它应该注重自己擅长的事情。这样一些代理类应运而生,它专门做一些事前和善后的处理,让委托类专注于自己的事情。在生活中有很多这样的例子,就像上面的迎宾团队,它的团队训练有素,能力很强,但是它却没有能力去接一些大活儿,这样他可以去找礼仪公司,两者签订合作协议,让礼仪公司出去接活儿,迎宾部分到时候包给该团队去做,这样各得其所。还有就是常常在幕后为明星忙碌的经纪人,他们就是活生生的代理。

        回到我们程序员的世界,看看那些有名的框架,像struts2中的action调用,hibernate的懒加载,springAOP,无不用到了代理模式,虽然不再是简单的静态代理,但是思想大抵如此。我们使用这些框架时,只需要专注自己的业务逻辑部分,其他重复机械的但不得不做的工作交给了这些幕后英雄。




    ================================== 赵客缦胡缨,吴钩霜雪明。 银鞍照白马,飒沓如流星。 ==================================
  • 相关阅读:
    MSDN Magazine搞错了
    Visual Studio 2005中设置调试符号(Debug Symbols)
    BCB 6的问题
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现人与身份证的一对一关系映射
    吴裕雄天生自然Spring BootSpring Data JPA
    吴裕雄天生自然Spring BootSpring Boot对JSP的支持
    吴裕雄天生自然Spring BootSpring Boot的异常统一处理
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现Author与Article的一对多关系映射
    吴裕雄天生自然Spring Boot解决 Error creating bean with name 'entityManagerFactory' defined in class path resource
    吴裕雄天生自然Spring Boot@ExceptionHandler注解和@ControllerAdvice注解
  • 原文地址:https://www.cnblogs.com/lucare/p/9312682.html
Copyright © 2011-2022 走看看