代理模式(Proxy)
来源:互联网 发布:知乎 知乎日报 区别 编辑:程序博客网 时间:2024/04/29 01:14
定义: 为其他对象提供一种代理以控制对这个对象的访问
(1)静态代理:
package com.eshore.zzy.design.pattern.proxy.staticproxy;
public interface Subject {
public void sayHello(String name);
}
package com.eshore.zzy.design.pattern.proxy.staticproxy;
public class SourceSubject implements Subject{
public void sayHello(String name){
System.out.println("Hello "+name);
}
}
package com.eshore.zzy.design.pattern.proxy.staticproxy;
/**
* 静态代理的类要和被代理的类实现同一个接口,实质是用到原类的方法
* @author zhouziyu
*
*/
public class ProxySubject implements Subject{
private SourceSubject ss;
public void sayHello(String name) {
if (ss == null) {
ss = new SourceSubject();
}
ss.sayHello(name);
System.out.println("静态代理调用");
}
}
package com.eshore.zzy.design.pattern.proxy.staticproxy;
public class Test {
public static void main(String args[]) {
Subject sb = new SourceSubject();
sb.sayHello("zhouziyu");
sb = new ProxySubject();
sb.sayHello("zhouziyu");
}
}
(2)动态代理:
package com.eshore.zzy.design.pattern.proxy.dynamicproxy;
public interface Subject {
public void sayHello(String name);
}
package com.eshore.zzy.design.pattern.proxy.dynamicproxy;
public class SourceSubject implements Subject{
public void sayHello(String name){
System.out.println("Hello "+name);
}
}
package com.eshore.zzy.design.pattern.proxy.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 动态代理要实现java.lang.reflect.InvocationHandler接口
*
* @author zhouziyu
*
*/
public class ProxySubject implements InvocationHandler {
private Object obj;
public ProxySubject(Object obj) {
this.obj = obj;
}
/**
* 方法的三个参数分别是,代理的原对象,方法,及对应的参数
*/
public Object invoke(Object target, Method method, Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
System.out.println("代理方法之前"+method.getName());
if(method.getName().equals("sayHello")){
System.out.println("hahahaha");
}else{
method.invoke(obj, args);
}System.out.println("代理方法完成"+method.getName());
return null;
}
}
package com.eshore.zzy.design.pattern.proxy.dynamicproxy;
import java.lang.reflect.Proxy;
/**
* 定义:为其他对象提供一种代理以控制对这个对象的访问
* 前提:在不改变接口的情况下
* @author zhouziyu
*
*/
public class Test {
public static void main(String args[]) {
Subject sub = new SourceSubject();
//动态代理的关键所在,三个参数分别是类加载器,接口,和InvocationHandler
sub = (Subject) Proxy.newProxyInstance(sub.getClass().getClassLoader(),
sub.getClass().getInterfaces(), new ProxySubject(sub));
sub.sayHello("zhouziyu");
}
}
- Proxy模式 代理模式
- 代理模式:Proxy模式
- 代理(Proxy)模式
- 代理模式Proxy Design
- 代理(Proxy)模式
- 代理(Proxy)模式
- 代理模式(Proxy Pattern)
- 代理(Proxy)模式
- 代理模式(Proxy Pattern)
- proxy(代理)模式
- Proxy Pattern (代理模式)
- Proxy pattern 代理模式
- 代理模式(Proxy)
- java 代理(proxy)模式
- Proxy 代理模式
- 代理模式(Proxy)
- 代理模式(Proxy pattern)
- Proxy(代理)模式
- ASP.NET操纵EXCEL导入SQL SERVER数据库的代码
- javascript中的instanceof和typeof区别
- 从sql2005Express,ASPNET.MDF到sql2005
- QClub:开源世界里谁需要标准?(12.13 北京)
- Struts2权限控制拦截器
- 代理模式(Proxy)
- SQL Server 中的触发器使用
- SpringSide 2.0使用方法简介
- 如何判断socket已经断开
- 为AND和OR函数找替身
- (转载)如何配置VMware中Linux系统网络
- 从小到大度过最冷的一个冬天!
- 韩磊-我心中的偶像
- C#中动态创建控件及事件处理程序、置于顶层