设计模式之代理模式

导读:本篇文章讲解 设计模式之代理模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

设计模式之代理模式

文章目录

  • 设计模式之代理模式
  • 一、代理模式是什么?
  • 二、代理模式详解
    • 1.代理模式组成
    • 2.示例demo
      • (1)、静态代理
      • (2)、动态代理
  • 总结
    • 优点
    • 缺点
    • 静态代理和动态代理的区别

一、代理模式是什么?

代理模式由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介
举个例子:过年回家需要买票,现在网上购票不只是12306了,也可以在美团等软件APP上面购买,美团就是代理,相当于我们与车票之间的中介。

二、代理模式详解

1.代理模式组成

代理模式的主要角色:

  • 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
  • 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

2.示例demo

代理模式分为静态代理和动态代理。

(1)、静态代理

在这里插入图片描述

public interface Ticket {
    void buy();
}
//这是12306网站、AAA网站的票、BBB网站的票
public class RealTicket implements Ticket {

    @Override
    public void buy() {
        System.out.println("买了一张车票");
    }
}

//买票代理类,相当于美团
public class ProxyTicket implements Ticket{
	//买票调用了12306的接口
    private RealTicket realTicket = new RealTicket();;

    @Override
    public void buy() {
        preBuy();
        realTicket.buy();
        afterBuy();
    }
    /*买票前*/
    public void preBuy(){
        System.out.println("检查是否有票");
    }
    /*买票后*/
    public void afterBuy(){
        System.out.println("票的数量减一");
    }
}
public class Test{
	/*测试demo*/
  public static void main(String[] args) {
        ProxyTicket meiTuan = new ProxyTicket();
        meiTuan.buy();
    }
}

上面举的例子仅仅是个举例,不代表实际情况。
静态代理可以在不修改目标对象功能的前提下,通过Proxy代理类对目标功能进行扩展,但是静态代理不够灵活。

(2)、动态代理

貌似举的例子翻车了,因为下面动态代理代理类是一个,可以代理多个实现类。暂且理解为美团卖的不只是12306的票,还有电影票、饭票等。

public interface Ticket {
    void buy();
}
//这是12306网站、AAA网站的票、BBB网站的票
public class RealTicket implements Ticket {

    @Override
    public void buy() {
        System.out.println("买了一张车票");
    }
}

//代理类,不需要时限Ticket接口,所以代理类只需要一个,代理对象可以多个
public class JdkTicket implements InvocationHandler {

    private Ticket target;

    /*通过反射来获取当前的代理类*/
    public Ticket getInstance(Ticket ticket){
        this.target = ticket;
        Class<?> clazz = target.getClass();
        return (Ticket) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }
    /*执行具体方法*/
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(this.target, args);
        after();
        return result;
    }

    private void before() {
        System.out.println("检查是否有票");
    }

    private void after() {
        System.out.println("票的数量减一");
    }
}
public class Test{
	/*测试demo*/
  public static void main(String[] args) {
        JdkTicket jdkTicket = new JdkTicket(); //代理类
        Ticket instance = jdkTicket.getInstance(new RealTicket()); //代理12306
        instance.buy();
    }
}

这就是动态代理,静态代理需要每个实际对象创建一个代理类,而动态代理一个代理类可以代理多个被代理对象

总结

优点

  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
  • 代理对象可以扩展目标对象的功能;
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

缺点

  • 代理模式会造成系统设计中类的数量增加;
  • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
  • 增加了系统的复杂度;

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

  • 静态代理只能通过手动完成代理操作,如果被代理类增加了新的方法,则代理类需要同步增加,违背开闭原则。
  • 动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则。
  • 若动态代理要对目标类的增强逻辑进行扩展,结合策略模式,只需要新增策略类便可完成,无需修改代理类的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/3417.html

(0)
小半的头像小半
0 0

相关推荐

  • 【设计模式】17.行为型模式-命令(Command) 技术随笔

    【设计模式】17.行为型模式-命令(Command)

    0 0106
    飞熊的头像 飞熊
    2023年8月10日
  • windows设置右键一键打开文件的配置 后端笔记

    windows设置右键一键打开文件的配置

    0 0177
    飞熊的头像 飞熊
    2023年8月4日
  • 操作系统—文件管理 前端开发

    操作系统—文件管理

    0 0157
    小半的头像 小半
    2022年5月27日
  • StringUtils.join的详解—LPF 技术随笔

    StringUtils.join的详解—LPF

    0 0102
    小半的头像 小半
    2023年1月26日
  • 项目不一定要部署到Tomcat的webapps文件夹下 其他分类

    项目不一定要部署到Tomcat的webapps文件夹下

    0 0218
    小半的头像 小半
    2022年11月10日
  • 目标检测(一)——概述 其他分类

    目标检测(一)——概述

    0 0113
    小半的头像 小半
    2022年11月6日
  • JavaScript性能优化怎么实现?12种优化方式你知道嘛 前端开发

    JavaScript性能优化怎么实现?12种优化方式你知道嘛

    0 083
    小半的头像 小半
    2024年3月22日
  • k8s 自身原理 2 Go语言

    k8s 自身原理 2

    0 0128
    小半的头像 小半
    2023年11月26日
  • Win11在关机按钮旁添加网络图标的方法 操作系统

    Win11在关机按钮旁添加网络图标的方法

    0 0213
    小半的头像 小半
    2023年1月31日
  • win11重启键在哪 windows11关机重启的设置方法 操作系统

    win11重启键在哪 windows11关机重启的设置方法

    0 0135
    小半的头像 小半
    2023年1月31日
  • Java并发编程-共享模型之管程(Monitor/Synchronized)(四) 技术随笔

    Java并发编程-共享模型之管程(Monitor/Synchronized)(四)

    0 0114
    小半的头像 小半
    2023年2月13日
  • Docker启动elasticsearch退出并报错AccessDeniedException/usr/share/elasticsearch/config/elasticsearch.yml解决方案 技术随笔

    Docker启动elasticsearch退出并报错AccessDeniedException/usr/share/elasticsearch/config/elasticsearch.yml解决方案

    0 0142
    小半的头像 小半
    2023年2月17日

站长精选

  • 扔掉okhttp、httpClient,这款轻量级 HTTP 神器好用到爆

    扔掉okhttp、httpClient,这款轻量级 HTTP 神器好用到爆

    2023年7月12日

  • 消灭空指针,Java 8 给我们更好的解决方案

    消灭空指针,Java 8 给我们更好的解决方案

    2023年2月10日

  • 分类树菜单,我从2s优化到0.1s

    分类树菜单,我从2s优化到0.1s

    2023年5月20日

  • SpringBoot+Redis BitMap 实现签到与统计功能

    SpringBoot+Redis BitMap 实现签到与统计功能

    2023年8月24日

  • 实现了一个自动批改小孩作业的功能,省心了!

    实现了一个自动批改小孩作业的功能,省心了!

    2024年3月20日

  • 一行 log 日志,结果引发了 P1 的线上事故!

    一行 log 日志,结果引发了 P1 的线上事故!

    2023年7月26日

  • 这款 Intellij IDEA 插件,堪称日志管理神器

    这款 Intellij IDEA 插件,堪称日志管理神器

    2023年6月18日

  • 从原理到实践,分析 Redisson 分布式锁的实现方案

    从原理到实践,分析 Redisson 分布式锁的实现方案

    2023年10月30日

  • macOS的福音:可以愉快地卸载掉 Docker Desktop 了!

    macOS的福音:可以愉快地卸载掉 Docker Desktop 了!

    2023年9月17日

  • 分库分表的 21 条法则,hold 住!

    分库分表的 21 条法则,hold 住!

    2023年6月18日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

PHP网站源码朝阳SEO按天扣费价格营口关键词按天扣费公司沈阳企业网站制作报价平顶山建设网站公司长春网站搭建报价木棉湾百度爱采购哪家好宿迁如何制作网站价格银川seo排名多少钱海东企业网站改版多少钱萍乡网站设计模板多少钱福田设计公司网站推荐塘坑SEO按效果付费推荐垦利模板推广推荐哈尔滨网站改版朝阳关键词排名多少钱黑河网站改版多少钱中山设计公司网站张北seo排名报价永州品牌网站设计推荐昌都英文网站建设公司嘉兴seo网站推广哪家好邯郸seo排名价格芜湖网站推广方案南宁网站seo优化多少钱揭阳关键词按天收费哪家好赣州网站推广工具报价连云港seo排名多少钱泉州企业网站设计价格甘孜百度爱采购价格鹰潭百度网站优化排名报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化