zoukankan      html  css  js  c++  java
  • 设计模式(代理)

      什么是代理模式及其作用

    Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一

    代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    优点:

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

    (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。

    (3).高扩展性

    结构

    一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理

    对象实现同一个接口,先访问代理类再访问真正要访问的对象。

    下面看个列子

    public interface KindWomen {
        
        public void throwEye();
        
        public void doSomething();
    }
    public class PJL implements KindWomen{
        
        public void throwEye(){
            System.out.println("潘金莲抛媚眼");
        }
        
        public void doSomething(){
            System.out.println("潘金莲...");
        }
    }
    public class XMQ {
        
        public static void main(String[] args) {
            PJL pjl= new PJL();
            KindWomen wp = new WP(pjl);
            pjl.throwEye();
        }
    }

     西门庆是无法直接知道潘金莲抛媚眼的,通过王婆代理

    public class WP implements KindWomen{
    
        private KindWomen kw;
    //构造方法用来收集传来的值
    public WP(KindWomen kw){ this.kw = kw; } public void throwEye() { kw.throwEye(); } public void doSomething() { kw.doSomething(); } }

    运行就结果

    动态代理

     动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。

    动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。

    (就是上述例子没有不用王婆了)

    Java.lang.reflect.Proxy类可以直接生成一个代理对象

    Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类
    	ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
    	Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
    	InvocationHandler:策略(方案)设计模式的应用。如何代理?
    
    InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行	
    	  Object proxy:代理对象本身的引用。一般用不着。
    	  Method method:当前调用的方法。
    	  Object[] args:当前方法用到的参数
    

      下面看例子

    public class XMQ {
        
        public static void main(String[] args) {
             final KindWomen kw = new PJL();
             KindWomen proxy = (KindWomen) Proxy.newProxyInstance(kw.getClass().getClassLoader(), kw.getClass().getInterfaces(), new InvocationHandler() {
    
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                    return method.invoke(kw, null);
                }
             });
             proxy.throwEye();
            proxy.doSomething();
        }
    }

     .结果

  • 相关阅读:
    剑指Offer34 数组中的逆序对
    剑指Offer33 第一个只出现一次的字符
    剑指Offer32 丑数
    剑指Offer31 把数组排成最小的数
    剑指Offer30 从1到n整数出现1的个数
    剑指Offer29 连续子数组最大和
    剑指Offer28 最小的K个数(Partition函数应用+大顶堆)
    DNS的递归查询和迭代查询
    剑指Offer27 数组中超过一半的数
    剑指Offer26 字符串的全排列
  • 原文地址:https://www.cnblogs.com/hudj/p/7008232.html
Copyright © 2011-2022 走看看