Java设计模式之代理模式


Posted in Java/Android onApril 22, 2022

模式: 代理模式

案例: 大奔代干娘卖酒

什么是代理模式

代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

优点

1、代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;

2、代理对象可以扩展目标对象的功能;

3、代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

缺点

1、代理模式会造成系统设计中类的数量增加

2、在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;

3、增加了系统的复杂度;

知识点

代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。

代理模式实现

案例: 大奔代干娘卖酒

抽象主题(Subject)类:卖酒

真实主题(Real Subject)类:干娘的酒馆

代理(Proxy)类:大奔的酒摊

大奔来干娘的酒馆前面摆了个摊代理卖酒的生意。

卖酒

一个卖酒接口,声明了一个卖酒的抽象方法

public interface Jiu {
    void show();
}

干娘的酒馆

干娘的酒馆类实现了卖酒的接口,并且实现了show()卖酒方法,声明了一个酒的名字,和一个aa()方法提示大奔来摆摊了

public class GanNiang implements Jiu {
    private String name;
    GanNiang() {
    }
    GanNiang(String name) {
        this.name = name;
        aa();
    }
    @Override
    public void show() {
        System.out.printf("卖出一坛%s", name);
    }
    public void aa() {
        System.out.println("大奔来摆摊了");
    }
}

大奔的酒摊

大奔的酒摊类实现了卖酒接口,声明了酒的名字和干娘酒馆的属性,并且实现了卖酒方法。

public class DaBen implements Jiu {
    private String name;
    private GanNiang ganNiang;
    DaBen() {
    }
    DaBen(String name) {
        this.name = name;
    }
    @Override
    public void show() {
        if (ganNiang == null) {
            ganNiang = new GanNiang(name);
        }
        ganNiang.show();
    }
}

测试

new一个大奔的酒摊,调用两次show()方法,就相当于卖了两次酒。

public class Demo {
    public static void main(String[] args) {
        DaBen daBen = new DaBen("女儿红");
        daBen.show();
        System.out.println();
        System.out.println();
        daBen.show();
    }
}

Java设计模式之代理模式

这里可以看出第一次卖酒和第二次卖酒输出的结果不一样,因为每一次卖酒都要去干娘的酒馆拿酒。大奔第一次来拿酒的时候通知干娘,我来摆摊了,后面干娘已经知道大奔来了所以再拿酒就不需要通知了。

总结

代理模式就是找一个代理代替自己去执行,这样只需要避免了重复new对象的浪费,并且可以找多个代理代替自己。

如:

1、Windows 里面的快捷方式。

2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。

3、买火车票不一定在火车站买,也可以去代售点。

4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。

到此这篇关于Java设计模式以虹猫蓝兔的故事讲解代理模式的文章就介绍到这了!

Java/Android 相关文章推荐
分析Netty直接内存原理及应用
Jun 14 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
java中重写父类方法加不加@Override详解
Jun 21 Java/Android
springboot拦截器无法注入redisTemplate的解决方法
Jun 27 Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
Mar 17 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Spring Boot接口定义和全局异常统一处理
Apr 20 Java/Android
Java由浅入深通关抽象类与接口(上篇)
Apr 26 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
SpringBoot详解整合Redis缓存方法
Jul 15 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 23 Java/Android
Java Redisson多策略注解限流
Sep 23 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 #Java/Android
Spring Boot接口定义和全局异常统一处理
Apr 20 #Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
Java Spring Boot 正确读取配置文件中的属性的值
Elasticsearch Recovery 详细介绍
Apr 19 #Java/Android
Elasticsearch 配置详解
Apr 19 #Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
You might like
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
jQuery中after的两种用法实例
2013/07/03 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
vue中如何使用ztree
2018/02/06 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python数据结构之链表的实例讲解
2017/07/25 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python使用folium库绘制地图点击框
2018/09/21 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
铭立家具面试题
2012/12/06 面试题
团日活动策划书
2014/02/01 职场文书
班级入场式解说词
2014/02/01 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
2016年会开场白台词
2015/06/01 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
MySQL普通表如何转换成分区表
2022/05/30 MySQL