代理设计模式设计模式 代理模式
静态代理
- 抽象角色 : 一般使用接口或者抽象类来实现
- 真实角色 : 被代理的角色,继承与抽象类
- 代理角色 : 代理真实角色 一般会做一些附属的操作 .类似于角色增强
- 客户 : 主函数,使用代理角色来进行一些操作
抽象角色
public interface Singer { /** * 歌星都能唱歌 */ void sing(); }真实角色
public class MaleSinger implements Singer{ private String name; public MaleSinger(String name) { this.name = name; } @Override public void sing() { System.out.println(this.name + "开始唱歌了!"); } }代理角色
public class Agent implements Singer { private Singer singer; public Agent(Singer singer) { this.singer = singer; } @Override public void sing() { System.out.println("节目组找过来!需要演出,谈好演出费用。。。。。"); singer.sing(); System.out.println("结算费用,下一次合作预约。。。。。。"); } }客户
public class Client { public static void main(String[] args) { Singer singer = new MaleSinger("鹿晗"); Singer agent = new Agent(singer); agent.sing(); } }鹿晗还是鹿晗,没有必要为了一下前置后置工作改变鹿晗这个类
公共的统一问题交给代理处理
公共业务进行扩展或变更时,可以更加方便
这不就是更加符合开闭原则,单一原则吗?
每个类都写个代理,麻烦死了。
动态代理
- 动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
- 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
- 基于接口的动态代理----JDK动态代理
- 基于类的动态代理–cglib(有兴趣自己研究)
jdk动态代理
【InvocationHandler:调用处理程序】
Object invoke(Object proxy, 方法 method, Object[] args); //参数 //proxy - 调用该方法的代理实例 //method -所述方法对应于调用代理实例上的接口方法的实例。方法对象的声明类将是该方法声明的接口,它可以是 代理类继承该方法的代理接口的超级接口。 //args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。原始类型的参数包含 在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。【Proxy : 代理】
//生成代理类 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(),this); }代码实现
package prox.Dprox; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Agent implements InvocationHandler { private Singer singer; public Agent(Singer singer) { this.singer=singer; } /** * 设置代理的经济人 * @param singer */ public void Agent(Singer singer) { this.singer = singer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("---------------经纪人把把关--------------"); Object returnObj = method.invoke(singer, args); System.out.println("---------------唱完了收收钱------------------------"); return returnObj; } /** * 获取一个代理对象 * @return */ public static Object getProxy(Singer singer){ Agent agent = new Agent(singer); return Proxy.newProxyInstance(Agent.class.getClassLoader(),singer.getClass().getInterfaces(),agent ); } } package prox.Dprox; public class Client { public static void main(String[] args) { Singer singer= new MaleSinger("刘德华"); Singer agent= (Singer)Agent.getProxy(singer); agent.sing(); Singer singer1= new MaleSinger("张学友"); Singer agent1= (Singer)Agent.getProxy(singer1); agent1.sing(); } }