zoukankan      html  css  js  c++  java
  • design_model(6)proxy

    1.代理模式

    代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,代理类知道被代理类的行为,代理类与被代理类实现的是同一个接口,代理类与被代理类的结构是相同的;

    2.静态代理:自己手写代理模式,作用代理指定接口下的实现,接口已经指定死了

    3.代码实例

    public interface Proxy {
    	public  abstract  void  getName();
    	public  abstract  void getAddress();
    	public  abstract  void getTel();
    }
    
    public class ProxyReal implements  Proxy {
    
    	@Override
    	public void getName() {
    		System.out.println("lili");
    	}
    
    	@Override
    	public void getAddress() {
    		System.out.println("beijing");
    	}
    
    	@Override
    	public void getTel() {
    		System.out.println("12345678");
    	}
    
    }
    
    public class ProxyHandle  implements  Proxy{
    	private  Proxy  proxy;
    	@Override
    	public void getName() {
    		proxy.getName();;
    	}
    
    	@Override
    	public void getAddress() {
    		proxy.getAddress();
    	}
    
    	@Override
    	public void getTel() {
    		proxy.getTel();
    	}
    
    	public ProxyHandle(Proxy proxy) {
    		super();
    		this.proxy = proxy;
    	}
    }
    

     4.动态代理模式//较静态代理模式是可以找使用时指定接口以及接口下的实现类

    public interface Proxy {
    	public  abstract  void  getName();
    	public  abstract  void getAddress();
    }
    
    
    public class ProxyReal implements  Proxy {
    
    	@Override
    	public void getName() {
    		System.out.println("lili");
    	}
    
    	@Override
    	public void getAddress() {
    		System.out.println("beijing");
    	}
    
    }
    
    public class ProxyHandle implements InvocationHandler {
    	private Proxy proxy1;
    
    	@Override // invoke(Object proxy, Method method, Object[] args) 利用的反射,可以对比一下方法反射
    	// 调用proxyreal时实际调用的方法,
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		method.invoke(proxy1, args);
    		return proxy;
    	}
    
    	public ProxyHandle(Proxy proxy) {
    		super();
    		this.proxy1 = proxy;
    	}
    }
    
    public class Client {
    	public static void main(String[] args) {
    		ProxyHandle proxyHandle = new ProxyHandle(new ProxyReal());
    		Class<?> clazz = ProxyReal.class;
    		// 需要指定类加载器的原因是防止已被某个加载器加载而不会再次加载(类加载机制,双亲委托机制),通过反射确定proxyreal.class的getInterfaces获取所实现的接口,
    		cn.dynamicproxy.test.Proxy proxy = (cn.dynamicproxy.test.Proxy) Proxy.newProxyInstance(clazz.getClassLoader(),
    				clazz.getInterfaces(), proxyHandle);
    		proxy.getName();
    		;
    	}
    }
    
  • 相关阅读:
    软件架构模式
    经济学基础
    使用vue-cli3新建一个项目,并写好基本配置
    vue+iview+less实现主题切换功能
    ivew table组件二次封装,解决slot-scope跨组件传递的问题
    vue-cli3使用less全局变量,不用每个组件引入less文件(亲测有效)
    vscode开发vue项目使用eslint+prettier格式化:保存时自动执行lint进行修复(升级篇,保存时可格式化模板和css)
    切换子路由时,父路由的组件会重新渲染
    更换路由时页面实现左右滑动的效果
    div设置为inline-block后,两个div之间有空隙
  • 原文地址:https://www.cnblogs.com/gg128/p/9556358.html
Copyright © 2011-2022 走看看