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 相关文章推荐
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
Java框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
Feign调用传输文件异常的解决
Jun 24 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
使用Spring处理x-www-form-urlencoded方式
Nov 02 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
springboot layui hutool Excel导入的实现
Mar 31 Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
May 20 Java/Android
Mybatis-plus配置分页插件返回统一结果集
Jun 21 Java/Android
SpringBoot详解自定义Stater的应用
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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
新手简单了解vue
2019/05/29 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
秋季运动会通讯稿
2014/01/24 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS
「月刊Action」2022年5月号封面公开
2022/03/21 日漫