您的位置:首页 > 编程语言 > Java开发

JAVA知识之设计模式(一):代理模式

2017-04-05 14:04 393 查看

 代理模式的概念

代理模式就是屏蔽用户对真实对象的访问,而是使用代理对象完成用户的请求。代理对象可以完成真实对象的所有功能,也可以添加特有的和真实对象无关的新功能。

生活中也常常见到代理模式的应用,例如我们可以到火车票代理点去购买火车票,代理点就是代理对象,替代火车站售票处来做发售车票的工作。著名的spring框架核心功能AOP也是应用了代理模式,将业务代码和系统代码解耦分离。

代理模式也能用来实现延迟加载功能,很多组件例如建立数据库的连接需要消耗大量的系统资源,软件启动时如果默认加载会造成资源浪费,因此我们初始化代理类,当用户执行数据库操作时,再进行数据库连接,加快了初始化的速度。

 静态代理

下面用一个例子说明最普通代理模式:

public class Proxy {

public static void main(String[] args) {
//实例化代理类
ProxyHello ph = new ProxyHello();
ph.sayHello("李艺彤");
}
}

interface IHello {
//定义接口
public void sayHello(String name);
}

class Hello implements IHello{

public void sayHello(String name){
System.out.println("你好," + name);
}
}

class ProxyHello implements IHello{
private Hello hello;
private String name;

public void proxyHello(String name){
this.name = name;
}

public void sayHello(String name) {
hello = new Hello();
hello.sayHello(name);
}
}


 动态代理

动态代理更加的灵活,根据调用的代理类方法动态生成代理类,避免了大量书写代理类接口的麻烦,而且也更易维护。

动态代理类必须实现InvocationHandler接口,通过调用这个接口的invoke方法来实现代理.

public class DynamicProxy {

public static void main(String[] args) {
//真实对象
IGoodbye goodbye = new Goodbye();
//传入代理对象调用的真实对象
InvocationHandler handler = new ProxyGoodbye(goodbye);
//通过Proxy的newProxyInstance方法来创建我们的代理对象
//handler.getClass().getClassLoader()是代理对象
//goodbye.getClass().getInterfaces()是给代理对象提供的接口
IGoodbye object = (IGoodbye)Proxy.newProxyInstance(handler.getClass().getClassLoader(), goodbye
.getClass().getInterfaces(), handler);

object.sayGoodbye("李艺彤");

}

}

interface IGoodbye {
//定义接口
public void sayGoodbye(String name);
}
//真实对象
class Goodbye implements IGoodbye{

public void sayGoodbye(String name) {
System.out.println("再见," + name);
}

}
//代理对象
class ProxyGoodbye implements InvocationHandler{
private Object object1;

public ProxyGoodbye(Object object){
this.object1 = object;
}

/**
* @param object 代理的真实对象
* @param method 代理的方法
* @param args 传入的参数
*/
public Object invoke(Object object2, Method method, Object[] args)
throws Throwable {

method.invoke(object1, args);

return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: