• Java设计模式-结构性设计模式(代理设计模式)


    简介

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

    应用场景

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

    在这里插入图片描述

    角色

    Subject

      抽象接⼝,真实对象和代理对象都要实现的⼀个抽象接⼝,好⽐销售数码产品
    
    • 1

    Proxy

      包含了对真实对象的引⽤,从⽽可以随意的操作真实对象的⽅法,好⽐ 代理加盟店
    
    • 1

    RealProject

      真实对象,好⽐⼚商销售数码产品
    
    • 1

    案例demo

    xxxx想卖手机,为以后退休⽣活做准备,代理各⼤⼚商的⼿机和电脑,⽤代理设计模式帮他实现下

      Subject 卖⼿机
      RealProject 苹果、华为⼚商,核⼼是卖⼿机,但是选址不熟悉
      Proxy ⽼王数码专卖店:代理卖⼿机,附加选地址,增加⼴告等
    
    • 1
    • 2
    • 3

    抽取公共接口

    /**
     * 抽取公共的方法
     */
    public interface DigitalSell {
    
        void sell();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    真实对象

    /**
     * 真实对象
     **/
    
    public class DigitalSellReal implements DigitalSell{
    
        @Override
        public void sell() {
    
            System.out.println("销售华为手机");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    代理对象

    /**
     * 代理对象,增加了功能
     **/
    
    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("投放广告");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    测试

    public class Main {
    
        public static void main(String[] args) {
    
    
            //真实对象的行为
            DigitalSell realObj = new DigitalSellReal();
            realObj.sell();
    
            System.out.println("===");
            //代理对象的行为
            DigitalSell proxy = new DigitalSellProxy();
            proxy.sell();
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果

    销售华为手机
    ===
    一个人流量很高的地址
    销售华为手机
    投放广告
    
    • 1
    • 2
    • 3
    • 4
    • 5

    优缺点

    优点

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

    缺点

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

    动态代理区别

      动态代理也有多种⽅式,cglib、jdk
    
    • 1

    装饰器模式的区别

      保护⽬标对象
      增强⽬标对象,和装饰模式类似了
    
    • 1
    • 2
  • 相关阅读:
    Hive Lateral View explode列为空时导致数据异常丢失
    渔业安全生产综合管理指挥系统-航迹数据优化方案
    activiti-api-impl
    Camera ITS当中的test_lens_shading_and_color_uniformity测试
    临床三线表/基线资料表一行代码绘制
    虚拟机部署linux网络连接配置
    thymeleaf
    Vue2 零基础入门 Vue2 零基础入门第五天 5.1 动态组件 && 5.2 插槽
    我们感知的内容是由大脑最支持的假设决定的吗?
    SpringCloud和SpringBoot版本对应关系
  • 原文地址:https://blog.csdn.net/csdn_mycsdn/article/details/132782272