//--------动态代理模式---------------
静态代理需要创建2个类 一个真实类一个代理类
动态代理则不需要创建这2个类;全部由工具生成代理类的内容
//---------------------接口类----------------
package java_237_GOF23设计模式_代理模式_动态模式_开发中常见的场景_练习;
/**
- 接口
/
public interface Star {//明星
//属性
void confer();//confer协议
void signContract();//signContract签订合同
void bookTicket();//bookTicket订票
void sing();//唱歌
void collectMoney();//收款
}
//----------------创建一个明星类--------------
package java_237_GOF23设计模式_代理模式_动态模式_开发中常见的场景_练习;
/* - 创建一个明星
*/
public class RealStar implements Star{//RealStar真正的明星
//重写方法
public void bookTicket() {
System.out.println(“RealStar.bookTicket()”);
}
public void collectMoney() {
System.out.println(“RealStar.collectMoney()”);
}
public void confer() {
System.out.println(“RealStar.confer()”);
}
public void signContract() {
System.out.println(“RealStar.signContract()”);
}
public void sing() {
System.out.println(“RealStar(张三本人).sing()”);
}
}
//---------------处理程序类---------------
package java_237_GOF23设计模式_代理模式_动态模式_开发中常见的场景_练习;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
-
StarHandler明星处理程序
*/
public class StarHandler implements InvocationHandler{Star realStar;//realStar真星
//构造器
public StarHandler(Star realStar) {
super();
this.realStar = realStar;
}
//重写;invoke调用
public Object invoke(Object proxy, Method method, Object[] args)
//Object proxy代理类;Method method正在调用的方法;Object[] args方法的参数
throws Throwable {//throws Throwable抛出异常
//流程控制
Object object = null;
System.out.println("==真正的方法执行前=");
System.out.println(“面谈,签合同,预付款,订机票”);
if(method.getName().equals(“sing”)){
object = method.invoke(realStar, args);//激活调用的方法;method方法
}
System.out.println("=真正的方法执行后=");
System.out.println(“收尾款”);
return object;
}
}
//-----------------测试类---------------
package java_237_GOF23设计模式_代理模式_动态模式_开发中常见的场景_练习;
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);
//ClassLoader.getSystemClassLoader()系统默认的加载器;new Class[]{Star.class}接口;handler是处理接口对象
proxy.sing();
}
}
//------------------------------结果-----------------