首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代理模式三问—百度真题

代理模式三问—百度真题

作者头像
码上积木
发布2020-10-29 16:40:07
3240
发布2020-10-29 16:40:07
举报
文章被收录于专栏:码上积木码上积木

工欲善其事,必先利其器。项目开发过程中设计模式可以说就是这个利器,无论哪种语言,哪种项目架构,都离不开各种设计模式,今天就一起来看看代理模式:

  • 什么是静态代理,用例子说明
  • 什么是动态代理,用例子说明,实际应用有哪些
  • 代理模式和装饰器模式区别

什么是静态代理,用例子说明

代理模式其实就是提供了对目标对象的另外的访问方式,通过代理对象访问目标对象 为啥要这么麻烦呢!!!其实是为了不去修改原有的代码,通过代理也可以访问这个对象而且可以进行扩展

比如明星接通告,一般商家要找明星做活动,是要先找到他的经纪人,然后经纪人去负责一些琐碎的或者运营方面的事情,而明星只需要做具体的活动相关事情就可以了。这里经纪人的作用就是作为了一个代理。静态代理例子如下:

 /**
     * 首先声明一个接口,用于工作的接口
     */
    public interface IStarDao {
        void dowork();
    }

    /**
     * 明星工作类
     * 主要为演戏
     */
    public class SuperStarDao implements IStarDao {

        @Override
        public void dowork() {
            //演戏工作
        }
    }

    /**
     * 经纪人代理类
     * 主要是负责接活,并且安排明星工作,以及后续宣传工作
     */
    public class StarbrokerDaoProxy implements IStarDao {

        private IStarDao starDao;

        public StarbrokerDaoProxy(IStarDao starDao) {
            this.starDao = starDao;
        }

        @Override
        public void dowork() {
            /*--接活--*/
            starDao.dowork();//明星工作
            /*--宣传工作--*/
        }
    }

具体使用如下:

    public void main() {
        SuperStarDao starDao = new SuperStarDao();
        StarbrokerDaoProxy proxy = new StarbrokerDaoProxy(starDao);
        proxy.dowork();
    }

什么是动态代理,用例子说明,实际应用有哪些

动态代理的特点是不需要提前创建代理对象,而是利用反射机制在运行时创建代理类,从而动态实现代理功能 也就是说,这里的明星不需要具体的经纪人了。有活动的时候,可以创建一个经纪人,可以是自己,可以是家人,然后完成原本代理的一些工作,见代码:

    public void main() {
        final IStarDao starDao = new SuperStarDao();

        IStarDao proxy = (IStarDao) Proxy.newProxyInstance(
                starDao.getClass().getClassLoader(),
                starDao.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*--接活--*/
                        Object returnValue = method.invoke(starDao, args);//明星工作
                        /*--宣传工作--*/
                        return returnValue;
                    }
                });

        proxy.dowork();
    }

实际应用比如大家很熟悉的Retrofit,我们只需要在interface里面写上需要配置的请求方法,并添加一些注解 然后创建出interface的实例,就可以直接调用方法进行网络请求了。

奥秘主要就在这个.create(ApiService.class)方法里面,看看源码:

  public <T> T create(final Class<T> service) {
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
              throws Throwable {
            ServiceMethod<Object, Object> serviceMethod =
                (ServiceMethod<Object, Object>) loadServiceMethod(method);
            OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
            return serviceMethod.callAdapter.adapt(okHttpCall);
          }
        });
  }

这个newProxyInstance方法了吧,这就是创建动态代理类的方法。invoke方法里面就是具体去拆解 接口里面方法的一些参数,然后完成网络请求的整个过程了,也就是代理帮你做的一些事情。

代理模式和装饰器模式区别

  • 代理模式,注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何。
  • 装饰模式,注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。

代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。而当我们使用装饰器模式的时候,通常的做法是将原始对象作为一个参数传给装饰者的构造器。比如以下案例:

//代理模式
public class Proxy implements Subject{

       private Subject subject;
       public Proxy(){
             //关系在编译时确定
            subject = new RealSubject();
       }
       public void doAction(){
             ….
             subject.doAction();
             ….
       }
}

//代理的客户
public class Client{
        public static void main(String[] args){
             //客户不知道代理委托了另一个对象
             Subject subject = new Proxy();
             …
        }
}

代理模式可以在代理类去创建对象实例,因为他的中心不在于对象本身,只是为了控制对象或者说代理对象做一些事情。而装饰器模式是关注对象本身


“Android开发者们,快来关注公众号【码上积木】,每天三问面试题,并详细剖析,助你成为offer收割机。 积累也是一种力量。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是静态代理,用例子说明
  • 什么是动态代理,用例子说明,实际应用有哪些
  • 代理模式和装饰器模式区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档