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 相关文章推荐
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
Jpa Specification如何实现and和or同时使用查询
Nov 23 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
JAVA长虹键法之建造者Builder模式实现
Apr 10 Java/Android
Java中的继承、多态以及封装
Apr 11 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Java 轮询锁使用时遇到问题
May 11 Java/Android
Java数据结构之堆(优先队列)
May 20 Java/Android
java实现自定义时钟并实现走时功能
Jun 21 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 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实现框架(二)
2006/10/09 PHP
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
python 带时区的日期格式化操作
2020/10/23 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
小学生自我鉴定
2013/10/12 职场文书
测绘工程个人的自我评价
2013/11/10 职场文书
法制报告会主持词
2014/04/02 职场文书
正规欠条模板
2015/07/03 职场文书
Python数据分析之绘图和可视化详解
2021/06/02 Python
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技