当前位置: 首页 >  网技达人 >  Java设计模式之代理模式--经纪人的工作

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

导读:前言.本文主要讲述代理模式 ,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。.一.什么是代理模式.代理模式是23种设计模式中结构型模式 的一种,它的核心是通过代理类来完成其他对象的访问,降低访问者和被访问者的耦合度,也对功能进行了增强。.二.生活中的代

前言

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

一.什么是代理模式

代理模式是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();
    }
}

五.总结

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

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

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

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

内容
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 记一次burp抓不到包的排查与处理
    记一次burp抓不到包的排查与处
    2023-12-07
    ​ 一次遇到了burp上奇怪的bug。访问某个页面显示 No response received from remote
  • 零信任介绍
    零信任介绍
    2023-12-04
    什么是零信任?.答:.零信任是一种条件访问控制模型,需要持续进行信任验证,然后才允许对应用和数据进行最低权限访问。零信任
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • DVWA靶场实战(九)——Weak Session IDS
    DVWA靶场实战(九)——Wea
    2023-12-03
    DVWA靶场实战(九).九、Weak Session IDS:.1.漏洞原理:.Weak Session.IDS也叫做弱
  • git 配置代理  >_>从此告别git clone几KiB/s了
    git 配置代理 >_>从此告
    2023-12-02
    windows 设置代理.http || https协议.//设置全局代理.//http.git config --gl
  • 风衣
    风衣
    2023-12-21
    风衣.产品功能.透气性高,能够有效排出体内热量和汗液,保持身体舒适.防风防水,能够有效阻挡外界风雨,保护身体不受天气影响
  • 毛衣
    毛衣
    2024-01-10
    毛衣产品介绍.产品功能.保暖:毛衣采用高品质的羊毛或羊毛混纺材料制成,具有良好的保暖性能,能有效阻挡寒冷空气对人体的侵袭
  • 短裤
    短裤
    2023-12-11
    时尚舒适,让您夏日更自在.产品功能.采用轻薄、透气的面料,给您清新舒适的穿着体验.弹性腰头设计,更贴合您的腰部曲线,穿着
  • 裙子
    裙子
    2023-12-16
    裙子.产品描述.我们的裙子采用高品质的面料制成,款式多样,适合各种场合穿着。无论是休闲的街头漫步,还是正式的商务会议,我
  • 袜子
    袜子
    2023-12-26
    产品介绍.产品功能.我们的袜子采用了优质的天然材料,具有吸湿透气、舒适柔软的特点。特别设计的弹性帮助固定袜子位置,并且不
  • 女童裤子
    女童裤子
    2024-01-10
    女童裤子.产品介绍.我们的女童裤子是为年龄在3-12岁之间的女孩设计的。我们的裤子不仅样式多样,而且舒适耐穿,适合学校、
  • 儿童外套
    儿童外套
    2023-12-06
    儿童外套.产品功能.我们的儿童外套具有多种功能,包括保暖、防风、防水和舒适。它们采用高质量的面料制成,能够有效地抵御寒冷
  • 牛仔裤
    牛仔裤
    2024-01-05
    牛仔裤.牛仔裤,是一种起源于美国的经典服装单品,以其耐穿耐磨的特性,成为了时尚界不可或缺的一部分。无论是男女老少,都能在
  • 婴儿连体衣
    婴儿连体衣
    2023-12-21
    婴儿连体衣.产品描述.婴儿连体衣是专门为婴儿设计的一款便捷舒适的睡衣,它将上衣和裤子融为一体,令宝宝在睡觉及活动时更加方
  • 外套
    外套
    2024-01-10
    外套.产品功能.外套是一种常见的服装,通常可作为保暖服装或装饰性服装穿着。它们有多种形式,包括短款和长款、有无连帽、单宽