zoukankan      html  css  js  c++  java
  • 代理模式/proxy模式/结构型模式

    代理模式proxy

    定义

    为其他对象提供一种代理,并以控制对这个对象的访问。最简单的理解,买东西都是要去商店的,不会去工厂。

    java实现三要素 proxy(代理)+subject(接口)+realSubject(实现类)

    1. 定义一个接口
    2. 代理类和实现类均实现1定义的接口
    3. 代理类持有实现类的实例,并在代理类中调用

    代码示例

    //定义共同的接口
    interface Sourceable{
        void method();
    }
    
    //具体实现类
    class Source implements Sourceable {
    	@Override
    	public void method() {
    		System.out.println("执行方法");
    		
    	}
    }
    
    //代理类(持有实现类实例)
    class SourceProxy implements Sourceable{
    	
    	Sourceable sourceable;
    	public SourceProxy(){
    		super();
    		sourceable=new Source();
    	}
    
    	@Override
    	public void method() {
    		System.out.println("代理前....");
    		sourceable.method();
    		System.out.println("代理后....");
    	}
    } 
    

    优点

    1. 代理模式可以实现对类的扩展,结构型模式,符合OCP原则
    2. 用户权限(根据权限分配资源)、数据库访问(隐藏数据库链接)等
    3. 一定程度上降低了使用者和实现者的耦合关系

    缺点

    在调用者和实现者之间增加了代理者,造成了额外的系统开销。

    JDK中的代理模式

    java.lang.reflect.Proxy,反射包中的代理类,Proxy类提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
    创建某一接口 Foo 的代理可以简单的调用:

    Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);  
    
    //JDK源码中newProxyInstance方法的声明
        /**
         * Returns an instance of a proxy class for the specified interfaces
         * that dispatches method invocations to the specified invocation
         * handler.
        **/
        public static Object newProxyInstance(ClassLoader loader,   Class<?>[] interfaces,  InvocationHandler h) throws IllegalArgumentException
    


    I am a slow walker, but I never walk backwards.



  • 相关阅读:
    我为何需要使用空接口?
    Castle 整合.NET Remoting
    MVC结构简介
    在asp.net页面上得到Castle容器的实例
    Castle.MVC框架介绍
    08.vue-router动态路由匹配
    07. vue-router嵌套路由
    06.路由重定向
    04 Vue Router路由管理器
    ES6新特性之 let 、const
  • 原文地址:https://www.cnblogs.com/lknny/p/5804311.html
Copyright © 2011-2022 走看看