做网站编程的电脑配置,建设信用卡积分商城网站,搜索引擎的工作原理有哪些,工信部网站备案平台代理#xff08;Proxy#xff09;模式介绍
作用#xff1a;通过代理可以控制访问某个对象的方法#xff0c;在调用这个方法前做前置处理#xff0c;调用这个方法后做后置处理。#xff08;即#xff1a; AOP的微观实现#xff01;#xff09; 核心角色 抽象角色(接口…代理Proxy模式介绍
作用通过代理可以控制访问某个对象的方法在调用这个方法前做前置处理调用这个方法后做后置处理。即 AOP的微观实现 核心角色 抽象角色(接口)定义公共对外方法 真实角色周杰伦实现抽象角色定义真实角色所要实现的业务逻辑 代理角色代理人实现抽象角色是真实角色的代理通过调用真实角色的方法来完成业务逻辑并可以附加自己的操作。 代理模式 1静态代理 角色 公共接口Star 真实角色RealStar(周杰伦.唱歌) 代理角色ProxyStar(代理人.面谈.订机票.签合同.[调周杰伦唱歌].收尾款) 客户类Client(小孩.调代理人) 缺陷1.大量代码重复 2.只能代理Star类型的对象 2jdk动态代理 角色 公共接口Star 真实角色RealStar(周杰伦.唱歌) 代理工厂ProxyFactroy{生成ProxyStar(宋吉吉.面谈.订机票.签合同.[调周杰伦唱歌].收尾款)} 客户类Client(小孩.调代理人) 3Cglib动态代理 cglib和jdk动态代理的区别cglib真实角色没有接口
静态代理
抽象角色公共接口
public interface Star {/*** 面谈*/void confer();/*** 签合同*/void signContract();/*** 订票*/void bookTicket();/*** 唱歌*/void sing();/*** 收钱*/void collectMoney();
}
真正角色周杰伦
public class RealStar implements Star{public void confer() {}public void signContract() {}public void bookTicket() {}public void sing() {System.out.println(静态代理方法周杰伦天青色等烟雨而我在等你...);}public void collectMoney() {}
}代理角色经纪人
public class ProxyStar implements Star{private Star Star;public ProxyStar(Star Star) {this.Star Star;}public void bookTicket() {System.out.println(ProxyStar.bookTicket());}public void collectMoney() {System.out.println(ProxyStar.collectMoney());}public void confer() {System.out.println(ProxyStar.confer());}public void signContract() {System.out.println(ProxyStar.signContract());}public void sing() {Star.sing();}
}测试Client
public class Client {public static void main(String[] args) {Star star new ProxyStar(new RealStar());star.confer();star.signContract();star.bookTicket();star.sing();star.collectMoney();}
}
测试结果 静态代理的缺点 代理类和实现类实现了相同的接口这样就出现了大量的代码重复。 代理对象只服务于一种类型的对象。如果要服务多类型的对象例如代码是只为UserService类的访问提供了代理但是还要为其他类如DeptService类提供代理的话就需要我们再次添加代理DeptService的代理类。
jdk动态代理
抽象角色公共接口
public interface Star {/*** 唱歌*/void sing();
}
真正角色周杰伦
//真实角色(周杰伦)
public class RealStar implements Star{Overridepublic void sing() {System.out.println(动态代理方法周杰伦天青色等烟雨而我在等你...);}
}代理角色经纪人----代理工厂
//代理类工厂
public class ProxyFactory {//优点此时可以代理任意类型的对象//真实角色(周杰伦)private Object realObj;public ProxyFactory(Object realObj) {this.realObj realObj;}//获得代理对象public Object getRealObj() {/*** Proxy作用创建代理对象* ClassLoader loader类加载器* Class?[] interfaces真实角色实现的接口根据接口生成代理类* InvocationHandler h增强的逻辑即如何代理(代理人要做的事)*/return Proxy.newProxyInstance(realObj.getClass().getClassLoader(),realObj.getClass().getInterfaces(),new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(真正的方法执行前);System.out.println(面谈签合同预付款订机票);Object result method.invoke(realObj, args);System.out.println(真正的方法执行后);System.out.println(收尾款);return result;}});}
}测试Client
public class Client {public static void main(String[] args) {//获得代理对象Star star (Star) new ProxyFactory(new RealStar()).getRealObj();star.sing();}
}
测试结果