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 Swing实现自助取款机系统
Jun 11 Java/Android
分享一些Java的常用工具
Jun 11 Java/Android
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
Spring boot应用启动后首次访问很慢的解决方案
Jun 23 Java/Android
java解析XML详解
Jul 09 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
Jul 16 Java/Android
java泛型通配符详解
Jul 25 Java/Android
spring boot中nativeQuery的用法
Jul 26 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
Android Rxjava3 使用场景详解
Apr 07 Java/Android
tree shaking对打包体积优化及作用
Jul 07 Java/Android
JDK8中String的intern()方法实例详细解读
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项目打包方法
2008/02/18 PHP
为PHP初学者的8点有效建议
2010/11/20 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php封装的验证码类分享
2017/02/26 PHP
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
python递归下载文件夹下所有文件
2019/08/31 Python
下载官网python并安装的步骤详解
2019/10/12 Python
基于python调用psutil模块过程解析
2019/12/20 Python
pandas按条件筛选数据的实现
2021/02/20 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
自荐信如何制作?
2014/02/21 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
村党支部公开承诺书
2014/05/29 职场文书
片区教研活动总结
2014/07/02 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
工程部经理岗位职责
2015/02/02 职场文书
行政诉讼答辩状
2015/05/21 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书