来源:http://www.bjsxt.com/
一、【GOF23设计模式】_代理模式、静态代理
package com.test.proxy.staticProxy; public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signConstract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
package com.test.proxy.staticProxy; public class RealStar implements Star{ @Override
public void confer() {
System.out.println("RealStar.confer()");
} @Override
public void signConstract() {
System.out.println("RealStar.signConstract()");
} @Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
} @Override
public void sing() {
System.out.println("RealStar(歌手本人).sing()");
} @Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
package com.test.proxy.staticProxy; public class ProxyStar implements Star{
private Star realStar; public ProxyStar(Star realStar) {
super();
this.realStar = realStar;
} @Override
public void confer() {
System.out.println("ProxyStar.confer()");
} @Override
public void signConstract() {
System.out.println("ProxyStar.signConstract()");
} @Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
} @Override
public void sing() {
realStar.sing();
} @Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
}
package com.test.proxy.staticProxy; public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
Star proxyStar = new ProxyStar(realStar); proxyStar.confer();
proxyStar.signConstract();
proxyStar.bookTicket();
proxyStar.sing();
proxyStar.collectMoney();
}
}
控制台输出:
ProxyStar.confer()
ProxyStar.signConstract()
ProxyStar.bookTicket()
RealStar(歌手本人).sing()
ProxyStar.collectMoney()
二、【GOF23设计模式】_代理模式、动态代理、开发中常见的场景
动态代理(动态生成代理类)
——JDK自带的动态代理
——javaassist字节码操作库实现
——CGLIB
——ASM(底层使用指令,可维护性较差) 动态代理相比于静态代理的优点
——抽象角色中(接口)声明的所有方法都被转移到调用处理器中一个集中的方法中处理,这样我们可以更加灵活和统一地处理众多的方法。
JDK自带的动态代理
——java.lang.reflect.Proxy
————作用:动态生成代理类和对象
——java.lang.reflect.InvocationHandler(处理器接口)
————可以通过invoke方法实现对真实角色的代理访问
————每次通过Proxy生成代理类对象时都要指定对应的处理器对象
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.sing();
package com.test.proxy.dynamicProxy; public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signConstract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
package com.test.proxy.dynamicProxy; public class RealStar implements Star{ @Override
public void confer() {
System.out.println("RealStar.confer()");
} @Override
public void signConstract() {
System.out.println("RealStar.signConstract()");
} @Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
} @Override
public void sing() {
System.out.println("RealStar(歌手本人).sing()");
} @Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
package com.test.proxy.dynamicProxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class StarHandler implements InvocationHandler{
private Star realStar; public StarHandler(Star realStar) {
super();
this.realStar = realStar;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { Object object = null; System.out.println("真正的方法执行前");
System.out.println("面谈,签合同,预付款,订机票"); if(method.getName().equals("sing")){
object = method.invoke(realStar, args);
} System.out.println("真正的方法执行后");
System.out.println("收尾款"); return object;
}
}
package com.test.proxy.dynamicProxy; import java.lang.reflect.Proxy; public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar); Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); proxy.sing();
}
}
控制台输出:
真正的方法执行前
面谈,签合同,预付款,订机票
RealStar(歌手本人).sing()
真正的方法执行后
收尾款