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 28 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
Jul 26 Java/Android
Java使用Unsafe类的示例详解
Sep 25 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 Java/Android
Java中API的使用方法详情
Apr 06 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
Java8 CompletableFuture 异步回调
Apr 28 Java/Android
Java实现简单小画板
Jun 10 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
java中如何截取字符串最后一位
Jul 07 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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
jQuery 一个图片切换的插件
2011/10/09 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
Python使用folium excel绘制point
2019/01/03 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
学习python需要有编程基础吗
2020/06/02 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
就业表自我评价分享
2014/02/06 职场文书
《颐和园》教学反思
2014/02/26 职场文书
护理目标管理责任书
2014/07/25 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
工作岗位职责范本
2015/02/15 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers