首页 > 编程语言 >10(结构型模式)java设计模式之代理模式

10(结构型模式)java设计模式之代理模式

时间:2023-01-08 23:57:34浏览次数:38  
标签:sell 10 对象 代理 模式 设计模式 public DigitalSell

一、什么是代理模式

简介:代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

  • 为其他对象提供—种代理以控制对这个对象的访问,属于结构型模式。
  • 客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象

应⽤场景:

  • 各大数码专营店,代理厂商进行销售对应的产品,代理商持有真正的授权代理书
  • 客户端不想直接访问实际的对象,或者访问实际的对象存在困难,通过一个代理对象来完成间接的访问
  • 想在访问一个类时做一些控制,或者增强功能

二、代理模式的实现方式

模式结构分析:

  • Subject(抽象对象角色):抽象接口,真实对象和代理对象都要实现的一个抽象接口,好比销售数码产品
  • Proxy(代理对象角色):包含了对真实对象的引用,从而可以随意的操作真实对象的方法,好比代理加盟店
  • RealProject(目标对象角色):真实对象,好比厂商销售数码产品

类关系图:

统一模型:

代码实现:

查看代码
/*
* 抽取公共的⽅法
* */
public interface DigitalSell {
    void sell();
}
/*
*  真实的对象
* */
public class DigitalSellReal implements DigitalSell {
    @Override
    public void sell() {
        System.out.println("销售华为⼿机");
    }
}
/*
* 代理对象,增加了功能
* */
public class DigitalSellProxy implements DigitalSell {

    private DigitalSell realObj = new DigitalSellReal();
    @Override
    public void sell() {
        makeAddress();
        realObj.sell();
        makeAD();
    }
    private void makeAddress(){
        System.out.println("⼀个⼈流量很⾼的地址");
    }
    private void makeAD(){
        System.out.println("投放⼴告");
    }
}

测试用例:

/*
* 代理模式
* */
@Test
public void proxyDesign(){
    //真实对象的⾏为
    DigitalSell realObj = new DigitalSellReal();
    realObj.sell();
    //代理对象的⾏为
    DigitalSell proxy = new DigitalSellProxy();
    proxy.sell();
}

测试结果:

销售华为⼿机
⼀个⼈流量很⾼的地址
销售华为⼿机
投放⼴告

方法评估:

    和装饰器模式的区别

  • 代理模式主要是两个功能保护目标对象
  • 增强目标对象,和装饰模式类似了

优点:

  • 可以在访问一个类时做一些控制,或增加功能
  • 操作代理类无须修改原本的源代码,符合开闭原则,系统具有较好的灵活性和可扩展性

缺点:

  • 增加系统复杂性和调用链路

三、动态代理与静态代理

查看代码
 public class DigitalSellProxyFactory implements InvocationHandler {

    private Object target;
    //调用此工厂方法获得代理对象,其并不知道返回的是代理类对象还是委托类对象。
    public static DigitalSell getInstance(){
        return new DigitalSellProxy(new DigitalSellReal());
    }

    /**
     * 获取代理对象
     **/
    public Object newProxyInstance(Object targetObject){
        // 目标对象赋值
        this.target = targetObject;
        // 返回代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("=========="+method.getName()+"=============");
        System.out.println("------JDK动态代理开始-------");
        Object result = method.invoke(target, args);
        System.out.println("------JDK动态代理结束-------");

        return result;
    }
}
   /*
    * 代理模式
    * */
    @Test
    public void proxyDesign(){  
        System.out.println("-------------动态代理与静态代理-----------");
        //动态代理
        DigitalSellProxyFactory factory=new DigitalSellProxyFactory();
        DigitalSell realObjStatic= factory.getInstance();
        realObjStatic.sell();
        //静态代理
        DigitalSell sayHello = (DigitalSell) (factory.newProxyInstance(realObj));
        sayHello.sell();
    }

执行结果:

-------------动态代理与静态代理
⼀个⼈流量很⾼的地址
销售华为⼿机
投放⼴告
==========sell=============
------JDK动态代理开始-------
⼀个⼈流量很⾼的地址
销售华为⼿机
投放⼴告
------JDK动态代理结束-------

静态代理和动态代理的区别:

静态代理:由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理:动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

静态代理缺点:

1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。

2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。

正因为静态代理有很多局限性,且编码起来没那么便捷,因此便出现了动态代理的方式。

标签:sell,10,对象,代理,模式,设计模式,public,DigitalSell
From: https://www.cnblogs.com/q994321263/p/16961858.html

相关文章

  • 12.30-0108文献阅读总结
      本周是论文研读第一周,可是一篇都没有仔细读完,怎样才算仔细研读呢,心里的标准是这样的:  1、从一定程度上区分筛选出好论文;  2、对作者及研究机构分析,在大实验的官......
  • 插入排序10-3
    ///<summary>///插入排序///从第2个数开始,跟第一个数对比,放在左边还是右边///循环下去比较,都放在合适的位置///</summary>///<paramname="arr"></param>publi......
  • CF1088C
    Solution一个很简单的想法就是将整个序列变成\(1\)到\(n\),这时我们需要对每个\(a_i\)执行\(\bmod(a_i-i)\)的操作,但是可能\(a_i<i\),所以我们只需要在一开始加上......
  • 红米AC2100 钛星人固件,用ttl刷回breed
    目录准备拆机准备刷回开始刷入breed参考资料去年手贱不小心把RM2100刷成钛星人固件,想要刷回来找不到方法,趁着这段时间回家又折腾了一下准备工具:杜邦线、电烙铁(非必须,有......
  • 安装蓝叠安装模拟器在Windows10
      下载地址:https://www.bluestacks.com/download.html     如果想使用模拟器打开tiktok的话可以如下操作 ......
  • 230108_50_RPC底层原理
    Stub还有很多需要优化的地方,目前只是实现了一个最基本的代理。网络传输都是通过序列化和反序列化进行的,目前java自带的Serializable接口效率比较低,因此可以对rpc的序列化......
  • 桥接模式
    概述《设计模式》中对于“桥接模式”的动机描述如下:将抽象部分与它的实现部分分离,使他们可以独立地变化桥接模式的类结构图一般如下所示:一般在以下几个场景使用桥......
  • Win10基础 dism 制作大于4G镜像的系统安装U盘
          OS:Windows10Version21H1      blog:师万物 typesetting:Markdown Win10基础dism制作大于4G镜像的系统安装U盘获得win10系统镜像......
  • 09.(结构型模式)java设计模式之装饰器模式
    一、什么是装饰器模式简介:也叫包装设计模式,属于结构型模式,它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。给对象增加功能,一般两种......
  • [转贴]win10临时修改、永久cmd 编码格式的方法
    https://www.jianshu.com/p/40a9fbaf1cac cmd前言有时候,运行一些命令行程序某些字符无法正常显示,常见的就是方块,或者是火星文字都是由于cmd程序的默认......