代理
普通代理
很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦。代理就为其他类提供了一种控制其对象的方法。代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法。
interface Solution{
public void doSomething();
}
//委托类Demo实现了接口
class Demo implements Solution{
public void doSomething() {
System .out.println( "do
something"); }
}
//代理类实现了委托了一样的接口
class ProxyDemo implements Solution{
private Demo demo ;
private ProxyDemo(){};
//委托类的对象成为代理类的内在属性
public ProxyDemo( Demo
demo){this .demo =demo ;}
public void doSomething() {
System .out.println( "————前处理————" );
demo. doSomething();
System .out.println( "————后处理————" );
}}
public class ProxyTest {
public static void main (String[] args) {
Solution
solution=new ProxyDemo(new Demo());
solution.doSomething ();
}
}//运行结果
/*————前处理————
do
something
————后处理————*/
动态代理
使用代理后,无论是调用Demo还是ProxyDemo都可以达到使用doSomething方法的目的,而且ProxyDemo还提供了一些额外的功能,提高了功能的扩展性,使程序更灵活。但是上例中,使用代理必须明确委托类和方法,扩展性不够。动态代理可以在未知委托类和方法的时候就写好程序,见招拆招,运行时才确定类,提高扩展性。
interface Solution{
public void doSomething();
}
//委托类Demo实现了接口
class Demo implements Solution{
public void doSomething() {
System .out.println( "do
something"); }
}
//动态代理
class ProxyDemo2 implements InvocationHandler {
//不确定委托类,使用接口引用
private Solution obj ;
private ProxyDemo2 (){}
public ProxyDemo2( Solution
obj ){this .obj =obj ;}
public Object
invoke( Object
proxy, Method
method, Object [] args )
throws Throwable {
// TODO Auto-generated
method stub
System . out. println( "————前处理2————" );
obj. doSomething ();
System . out. println( "————后处理2————" );
return null ;
}
}
public class ProxyTest {
public static void main ( String[] args ) {
Demo
demo =new Demo ();
Class cla =demo .getClass ();
InvocationHandler
handle =new ProxyDemo2 (demo );
//动态代理就是在运行的时候才确立的类。见招拆招
Solution
solution2 =( Solution )Proxy .newProxyInstance
( cla. getClassLoader() ,cla .getInterfaces (), handle );
solution2 .doSomething ();
}
} //运行结果
/*
————前处理2————
do
something
————后处理2————
*/
动态代理有一个核心接口InvocationHandler,里面只有一个方法,用于封装实际类的方法。和一个工具类Proxy可以为你建立一个委托类的实例。