Java设计模式——代理模式实现及原理

来源:互联网 发布:常见的网络硬件有哪些 编辑:程序博客网 时间:2024/05/19 22:25

简介

  • 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
  • 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。
  • 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子。
  • 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象。

静态代理

  • 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。

  • 下面举个案例来解释 :
    让目标对象返回的字母大写,定义一个接口:ISomeService.java,然后目标对象实现这个接口的方法SomeServiceImpl.java,此时如果使用静态代理方式,就需要在代理对象(SomeServiceProxy.java)中也实现ISomeService接口.调用的时候通过调用代理对象的方法来调用目标对象.
    需要注意的是,代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。
/** * 接口 */public interface ISomeService {    String save();}
/** * 接口实现 * 目标对象 */public class SomeServiceImpl implements ISomeService {    @Override    public String save() {        System.out.println("数据已保存");        return "abc";    }}
/** * 代理对象,静态代理 */public class SomeServiceProxy implements ISomeService {    //接收保存目标对象    private ISomeService target;    public SomeServiceProxy( ){        target = new SomeServiceImpl();    }    @Override    public String save() {       String result = target.save();//执行目标对象的方法       return result.toUpperCase();    }}
/** - 测试 */public class MyTest {    public static void main(String[] args) {        ISomeService proxy = new SomeServiceProxy();        String result = proxy.save();        System.out.println(result);    }}

静态代理总结:
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:
- 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。


动态代理jdk

动态代理有以下特点 :

  1. 代理对象,不需要实现接口.
  2. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型).
  3. 动态代理也叫做:JDK代理,接口代理

JDK中生成代理对象的API

  • 代理类所在包:java.lang.reflect.Proxy
  • JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

注意该方法是在Proxy类中是静态方法,且接收的三个参数依次为:

  1. ClassLoader loader:指定当前目标对象使用类加载器,获取加载器的方法是固定的.
  2. Class<?>[] interfaces:目标对象实现的接口的类型,使用泛型方式确认类型.
  3. InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入.
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 租客与房东纠纷怎么办 乙肝打了瘦脸针怎么办 去绣水搞到手上痛怎么办 脚破了皮很痛怎么办 脚被车撞了肿了怎么办 ps4光盘花了怎么办 耳后总是长孑子怎么办 孩孑高三总是玩手机怎么办 摩托车被收了怎么办 摩托车的手续都怎么办 摩托车罚单掉了怎么办 行人遇到黄灯该怎么办 长辈借钱不还怎么办 不绣刚电梯轿壁有凹槽怎么办 电梯下限位故障怎么办 卫生间夏天太热怎么办 07大檐帽变形了怎么办 税务局不批发票怎么办 进项发票太多了怎么办 发票报销联丢失怎么办 发票领用簿没有怎么办 发票购买本遗失怎么办 销售方遗失发票怎么办 增值税发票发票联丢失怎么办 苹果购买发票丢失怎么办 空白增值税发票发票丢失怎么办 网购发票 领购簿怎么办 购物发票丢了怎么办 饭店客人买单要少钱怎么办 发票备注栏写错怎么办 卖房子发票丢失怎么办 发票二维码蓝票怎么办 车祸伤者出院怎么办 微信付款失败怎么办 增值税电子发票没打税号怎么办 买假出租车发票怎么办 纳税号错了怎么办 发票抬头写错怎么办 增值税发票打错顺序怎么办 发票打错了怎么办 电子发票错了怎么办