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常用的加密算法
Jun 11 Java/Android
深入理解以DEBUG方式线程的底层运行原理
Jun 21 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
java如何实现socket连接方法封装
Sep 25 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 Java/Android
OpenFeign实现远程调用
Aug 14 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
德生1994机评
2021/03/02 无线电
PHP也可以?成Shell Script
2006/10/09 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
代办委托书怎样写
2014/04/08 职场文书
花田少年史观后感
2015/06/16 职场文书
八年级英语教学反思
2016/02/15 职场文书
golang中的并发和并行
2021/05/08 Golang
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
frg-100简单操作(设置)说明
2022/04/05 无线电