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实践之建造者模式
Jun 18 Java/Android
总结一下关于在Java8中使用stream流踩过的一些坑
Jun 24 Java/Android
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
springboot新建项目pom.xml文件第一行报错的解决
Jan 18 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
Java对文件的读写操作方法
Apr 29 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
Spring中bean集合注入的方法详解
Jul 07 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 23 Java/Android
java获取一个文本文件的编码(格式)信息
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采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
简单实现JavaScript弹幕效果
2020/08/27 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python从零开始创建区块链
2018/03/06 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
简单了解如何封装自己的Python包
2020/07/08 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
个人求职信范文分享
2014/01/06 职场文书
绿色环保演讲稿
2014/05/10 职场文书
施工质量承诺书范文
2014/05/30 职场文书
世界环境日活动总结
2015/02/11 职场文书
发票退票证明
2015/06/24 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript