首页 > 编程语言 >Java设计模式之代理模式--经纪人的工作

Java设计模式之代理模式--经纪人的工作

时间:2023-06-20 10:13:19浏览次数:61  
标签:Java -- 经纪人 代理 中介 对象 房产 设计模式 public

前言

本文主要讲述代理模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

一.什么是代理模式

代理模式是23种设计模式中结构型模式的一种,它的核心是通过代理类来完成其他对象的访问,降低访问者和被访问者的耦合度,也对功能进行了增强。

二.生活中的代理模式

1.经纪人

每个艺人都拥有自己的经纪人,帮助他处理工作上的事情,例如帮艺人接活、商务谈判、宣传包装等等,如果我们想联系上哪位艺人,主要就是通过经纪人来完成,而经纪人就跟设计模式中的代理模式类似。

2.房产中介

现在很多年轻人在大城市工作都是租房住的,大家现在购买房子或者租房的话是不是通过房产中介呢,反正是通过房产中介找到房子的,而房产中介他是负责帮助房主出售或者出租房子的,通过房产中介我们就无需每个房子都需要通过联系房主来获取房源信息,大大提高了我们选房效率,而房产中介就跟设计模式中的代理模式类似。

3.婚介

现在有很多婚介公司或者各种APP来帮助大家扩展社交范围,认识更多的人,提升恋爱率和结婚率。而婚介公司或者各种交友APP就跟设计模式中的代理模式类似。

三.代理模式的实现

代理模式有两种,一种是静态代理,一种是动态代理

1.静态代理

接下来就以演员和经纪人来举例,通过静态代理来实现。先创建一个接口和被代理对象类演员类以及静态代理类经纪人类

package com.qianfeng.ran;

/*
 * @author:江帅
 *      接口
 *          人类接口
 */
public interface Human {
    void behavior();
}



/*
 * @author:江帅
 *      被代理对象类
 *              演员类
 */
class Actor implements Human{
    @Override
    public void behavior() {
        System.out.println("某某明星进行拍戏");
    }
}



/*
 * @author:江帅
 *      静态代理类
 *          经纪人
 */
class Broker implements Human{
    private Human human;
    //获取具体的明星对象
    public Broker(Human human){
        this.human = human;
    }
    @Override
    public void behavior() {
        System.out.println("接商演");
        System.out.println("安排行程");
        human.behavior();
        System.out.println("后续工作进行");
    }
}

然后创建一个客户端使用代理模式,完成通过经纪人联系演员让演员拍戏,并增强功能

package com.qianfeng.ran;

/*
 * @author:江帅
 *          客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建明星对象
        Actor actor = new Actor();

        //创建经纪人对象并传递明星对象
        Broker broker = new Broker(actor);
        //执行结果:
        //接商演
        //安排行程
        //某某明星进行拍戏
        //后续工作进行
        broker.behavior();
    }
}

2.动态代理

接下来我们以房产中介的来举例,使用动态代理来实现。先创建代理接口人类接口和被代理对象类用户类

package com.qianfeng.ran;

/*
 * @author:江帅
 *          接口
 *              人类接口
 */
public interface Human {
    void behavior();
}



/*
 * @author:江帅
 *          被代理对象类
 *              用户
 */
public class User implements Human{
    @Override
    public void behavior() {
        System.out.println("租房");
    }
}

再创建一个动态代理类房产中介类

package com.qianfeng.ran;
/*
 * @author:江帅
 *         动态代理类
 *              房产中介
 */
public class DynamicProxy implements InvocationHandler {
    //需要被代理的对象
    private Object obj;

    public Object newInstance(Object obj){
        this.obj = obj;
        /**
         *  第一个参数为被代理对象的类加载器
         *  第二个参数为被代理对象的接口
         *  第三个此参数为当前对象
         */
        return Proxy.newProxyInstance(obj.getClass().getClassLoader()
                ,obj.getClass().getInterfaces(),
                this);
    }

    /**
     *  调用被代理对象的方法都会经过该方法
     * @param proxy 代理对象的引用
     * @param method 被调用的方法对象
     * @param args  被调用方法的参数数组
     * @return		原方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        start();
        //调用被代理对象的方法
        Object respBean = method.invoke(obj, args);
        commit();
        return respBean;
    }

    public void start(){
        System.out.println("带客户看房子");
    }

    public void commit(){
        System.out.println("与客户签署合同");
    }
}

最后动态代理实现通过房产中介增强用户寻找房子的行为

package com.qianfeng.ran;

/*
 * @author:江帅
 *      客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建房产中介            --  代理对象类
        DynamicProxy proxy = new DynamicProxy();

        //通过房产中介找房子     --   调用代理对象的方法并传递被代理对象,实现增强
        Human human = (Human) proxy.newInstance(new User());
        //执行结果:
        //带客户看房子
        //租房
        //与客户签署合同
        human.behavior();
    }
}

五.总结

代理模式中分为两种代理:静态代理和动态代理

静态代理的实现会导致代理类的冗余,每增加一个被代理对象就需要增加一个代理类。就像一对一的明星经纪人,每多一个明星就需要多一个经纪人。

动态代理的实现则减少了代理类的冗余,只需要一个动态代理类即可,但是会对被代理的对象每个方法都进行增强。就像房产中介,每多个客户并不需要再额外多一个中介来服务,房产中介可以一个人对多个用户,但是每个用户得到的都是同一个房产中介的服务。

下一章,将带大家学习电脑与游戏的关系(设计模式之桥接模式)

标签:Java,--,经纪人,代理,中介,对象,房产,设计模式,public
From: https://www.cnblogs.com/qian-fen/p/17492859.html

相关文章

  • jdk 各个版本记录
     历史更新中的重要历史迭代JDK8:2014年发布,引入了重要的新特性,如Lambda表达式、流式API、默认方法、日期/时间API等。还包含了性能改进、新的垃圾回收器和新的JavaScript引擎等。JDK17:2021年发布,是一个长期支持(LTS)版本,包含了一些重要特性,如SealedClasses改进、Pa......
  • 运动控制,数控系统所需要的各种插补以及加减速的文献 用FPGA开发了款类似MCX314跟pcl6
    运动控制,数控系统所需要的各种插补以及加减速的文献用FPGA开发了款类似MCX314跟pcl6045的运动控制IC,在开发的过程中,大量参考了文献.现在将这些文献出,可以缩短你的开发时间.整个资料压缩后有1G大小运动控制是指通过控制系统对机械设备的运动进行精确控制的过程。它在各种工......
  • 清除浮动
    一、概念浮动元素脱离文档流,影响布局,需要清除浮动二、方法方法一:额外标签法  给谁清除浮动,就在其后额外添加一个空白标签,给其设置clear:both方法二:父元素添加overflow:hidden 通过触发BFC方式,实现清除浮动方法三:使用after伪元素清除浮动#parent:after{c......
  • 海康威视SDK - 获取硬盘录像机参数及摄像头信息
    获取硬盘录像机参数及摄像头信息获取硬盘录像机参数命令参数NET_DVR_GET_DEVICECFG_V40结构体NET_DVR_DEVICECFG_V40//DVR设备参数[StructLayoutAttribute(LayoutKind.Sequential)]publicstructNET_DVR_DEVICECFG_V40{publicuintdwSize;[MarshalAsAttr......
  • 这里提供了一个移动电源解决方案,其中包含了PCB原理图。移动电源解决方案是指为移动设
    这里提供了一个移动电源解决方案,其中包含了PCB原理图。移动电源解决方案是指为移动设备提供电力供应的解决方案。PCB原理图是指移动电源电路板的设计图纸,用于指导电路板的制造和组装。关于知识点和领域范围的延申科普,移动电源解决方案涉及到电力供应和电路设计。移动电源是一种便......
  • Min-25 筛学习笔记
    Min-25筛学习笔记\(\text{ByDaiRuiChen007}\)一、简要介绍Min-25筛,是一种能在亚线性时间内求出特定的一类积性函数\(f(i)\)的前缀和的算法。具体来说,Min-25筛可以在\(\mathcalO(\sqrtn)\)的空间复杂度与\(\mathcalO(\dfrac{n^{3/4}}{\logn})\)的时间复杂度内求......
  • header("Content-type:text/html;charset=utf-8")
    它的意思是设置页面内容是html,编码格式是utf-8。header()函数的作用是:发送一个原始HTTP标头[HttpHeader]到客户端。标头(header)是服务器以HTTP协义传HTML资料到浏览器前所送出的字串,在标头与HTML文件之间尚需空一行分隔。在PHP中送回HTML资料前,需先传完所有的标......
  • 也说一说IDEA热部署Web项目最终解决方案,确实大大提高工作效率
    热部署就是正在运行状态的应用,修改了它的源码之后,在不重新启动的情况下能够自动把增量内容编译并部署到服务器上,使得修改立即生效。热部署为了解决的问题有两个:1、在开发的时候,修改代码后不需要重启应用就能看到效果,大大提升开发效率;2、生产上运行的程序,可以在不停止运行的情况......
  • 注重隐私安全以及方便运行 Windows 程序的发行版:Robolinux
    导读Robolinux 是一个基于最新的Ubuntu长期支持版本的Linux发行版,它使用Ubuntu20.04,22.04等LTS的源代码从零开始构建,注重隐私和安全以及高生产力,2023年5月更新了其最新版本 RobolinuxR12。该项目的一个更有趣的特点是提供了一个预配置的虚拟机支持包,其中包含......
  • 这里提供了一个基于STM32F103系列单片机的项目工程文件,其中包含了STM32 PLC底层源码和
    这里提供了一个基于STM32F103系列单片机的项目工程文件,其中包含了STM32PLC底层源码和FX2N源码。底层源码实现了断电保持功能,并且适合初学者,因为有很多注释解释了三菱指令编码。这个项目需要使用KeilMDK4.7以上的版本进行编译,CPU需要是STM32F103,RAM内存至少为64K,Flash程序空间至......