JAVA设计模式之代理模式

情景对话玩转java设计模式 - 代理模式 最近一直在看一些框架的源码,发现到最后很多地方都用到代理,尤其是动态代理。例如SpringData jpa中EntityManager的创建过程。在23种设计模式中有一种模式就是代理模式,这里打算对这种模式整理一下,并从源码的角度分析一下对象是如何生成出来的。个人觉得这个模式是23种当中最难的一种,深研究的话需要追述到jvm,这里尽量讲明白,不足之处希望大家指正。 定义 所谓的代理,就是中介,也就是说给目标对象提供一个代理(中介)对象,并由这个中介对象去控制对目标对象的引用。这样做的好处是: 通过代理. 阅读详情

一、代理模式的定义

代理模式是一个使用率非常高的模式 : 

为其他对象提供一种代理以控制对这个对象的访问。

1、Sudject 抽象主题角色

 抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。

public interface Subject {
  //定义一个方法
  public void request();
}


2、RealSubject 具体主题角色

 也叫做被委托角色、被代理角色。它才是业务逻辑的具体执行者。

public class RealSubject implements Subject {
  //实现方法
  public void request() {
  //业务逻辑处理
  }
}


3、Prixy 代理主题角色

 也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

public class Proxy implements Subject {
  //要代理哪个实现类
  private Subject subject = null;
  //默认被代理者
  public Proxy(){
  this.subject = new Proxy();
  }
  //通过构造函数传递代理者
  public Proxy(Object...objects ){}
  //实现接口中定义的方法
  public void request() {
  this.before();
  this.subject.request();
  this.after();
  }
  //预处理
  private void before(){
  //do something
  }
  //善后处理
  private void after(){
  //do something
  }
}

二、代理模式的优点

1、职责清晰
 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
2、高扩展性
 具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。
3、 智能化
 这在我们以上的讲解中还没有体现出来,不过在我们以下的动态代理章节中你就会看到代理的智能化有兴趣的读者也可以看看Struts是如何把表单元素映射到对象上的。

三、代理模式的使用场景


  我相信第一次接触到代理模式的读者肯定很郁闷,为什么要用代理呀?想想现实世界吧,打官司为什么要找个律师?因为你不想参与中间过程的是是非非,只要完成自己的答辩就成,其他的比如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。代理模式的使用场景非常多,大家可以看看Spring AOP,这是一个非常典型的动态代理。


代码

引子 : 现在这个时代大家基本上都有玩游戏当然感觉现在最火的应该是王者荣耀吧 , 在公司里吃饭的时候和同事来撸一把增进增进大家之间的 “团结” ,我们今天就通过游戏的方式来给大家介绍并学习一下代理模式。

游戏者接口

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili;

/**
 * Created by liangshaoteng on 17-7-24.
 */

public interface IGamePlayer {
    //游戏登录
    public void login(String user, String password);
    //开撸
    public void killBoss();
    //排位升级
    public void upgradle();
}

游戏者

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili;

/**
 * Created by liangshaoteng on 17-7-24.
 */

public class GamePlayer implements IGamePlayer {
    private String name="";
    public GamePlayer(String name) {
        this.name = name;
    }

    @Override
    public void login(String user, String password) {
        System.out.println("登录名为"+user+"的用户"+this.name+"登录成功!");
    }

    @Override
    public void killBoss() {
        System.out.println(this.name + "正在游戏中!");
    }

    @Override
    public void upgradle() {
        System.out.println(this.name + " 排位等级升了一星!");
    }
}

游戏场景

package com.example.liangshaoteng.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili.GamePlayer;
import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili.IGamePlayer;
import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.jianzhaozhe.BenzModel;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IGamePlayer iGamePlayer = new GamePlayer("活力の邮筒");
        iGamePlayer.login("liangshaoteng","123456");
        //正在游戏中
        iGamePlayer.killBoss();
        //排位升级
        iGamePlayer.upgradle();
    }
}

运行结果 : 

登录名为liangshaoteng的用户  活力の邮筒登录成功!

活力の邮筒正在游戏中!

活力の邮筒排位等级升了一星!


OK可以正常吃的玩游戏,但是我们过一段时间发现我们现实中我们的排位等级一直上不上去 , 然找代练 下面给大家看一下代码是怎么找代练的


代练者

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili;

/**
 * Created by liangshaoteng on 17-7-24.
 */

public class GamePlayerProxy implements IGamePlayer {

    private IGamePlayer iGamePlayer;
    //给谁进行代练
    public GamePlayerProxy(IGamePlayer iGamePlayer) {
        this.iGamePlayer = iGamePlayer;
    }
    //代练登录
    @Override
    public void login(String user, String password) {
        this.iGamePlayer.login(user,password);
    }
    //代练游戏中
    @Override
    public void killBoss() {
        this.iGamePlayer.killBoss();
    }
    //代练升级
    @Override
    public void upgradle() {
        this.upgradle();
    }
}

修改后的场景类


package com.example.liangshaoteng.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili.GamePlayer;
import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili.GamePlayerProxy;
import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.daili.IGamePlayer;
import com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.jianzhaozhe.BenzModel;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IGamePlayer iGamePlayer = new GamePlayer("]");
        GamePlayerProxy gamePlayerProxy = new GamePlayerProxy(iGamePlayer);
        gamePlayerProxy.login("liangshaoteng","123456");
        //正在游戏中
        gamePlayerProxy.killBoss();
        //排位升级
        gamePlayerProxy.upgradle();
    }
}

运行结果 : 

登录名为liangshaoteng的用户  活力の邮筒登录成功!

活力の邮筒正在游戏中!

活力の邮筒排位等级升了一星!


好了,你会发现好像没有什么区别啊,但是你有没有发觉你的游戏已经在升级,并且有人帮你在干活啦! 这就是代理模式。

Java 24 Design Pattern 之 代理模式 代理模式 阅读详情

相关推荐

利用图层自动识别算法实现CAD到Revit BIM模型的高效转换 - VS2022与AutoCAD2024开发环境配置指南

本文详细介绍了如何配置VS2022与AutoCAD2024开发环境,并利用图层自动识别算法实现CAD图纸到Revit BIM模型的高效自动化转换。通过解析CAD图层的规律性,该算法能智能识别并分类墙、门、窗等构件,提取几何信息并驱动Revit自动创建三维模型,从而将传统繁琐的人工“翻模”工作转化为高效、准确的自动化流程,大幅提升BIM模型创建效率。

Apple的专栏 1124

Carson带你学设计模式:建造者模式(Builder Pattern)

手把手带你全面了解建造者模式

Carson带你学Android 6万+

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 707

23种设计模式(4):建造者模式

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类型:创建类模式 类图: 四个要素 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。 抽象建造者:引入抽象建造者的目的...

java开发指南博客 【转载】 1891

常见卫星图源下载教程

上面列出的8个常见的亚米级别数据源都可以通过xyz协议或者wmts/wms协议进行下载。这些协议是什么?地理信息数据为了方便网络传输,制定了一系列的地理数据传输标准(wms/wmts/xyz等)。协议特点优点缺点栅格数据支持矢量数据支持WMS通过HTTP请求获取GIS数据,服务器会将数据渲染成图像高度定制的地图;交互性强服务器渲染图像,响应时间较长支持有限支持WMTS提供预渲染的地图瓦片速度快,因为地图瓦片可以预先生成并在请求时快速提供瓦片的内容是预先确定的,无法进行定制支持。

锐多宝的地理空间 1万+

MOSFET开关损耗全面讲解:从原理到优化策略

深入剖析MOSFET开关损耗的产生机制,结合实际应用场景,讲解如何通过驱动设计和电路优化降低损耗,提升系统效率。重点关注mosfet在高频开关下的表现与热管理。

weixin_29476595的博客 1058

java设计模式之 代理模式【Proxy Pattern】 详解

首先我们举个例子说明一下什么是策略模式: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代理的人能干活呀。 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的: 先定义一种类型的女人: package com.cbf4lif...

蛋蛋淡淡定的庄园 299

从零到一:RagFlow源码架构深度解析与二次开发实战指南

本文深入解析RagFlow源码架构,提供从环境搭建到二次开发的全流程实战指南。作为企业级AI搜索框架,RagFlow通过模块化设计和多模态处理能力,支持自定义智能体开发与文搜文档功能,帮助开发者高效构建智能搜索系统。

w1x2y3的博客 267

Java开发之设计模式--代理模式(Proxy Pattern)

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。模拟场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理。Java程序: 先定义一种类型的女人: package com.zanelove.proxy; /** * I'm glad

ZaneLove's blog 1075

达梦数据库导入报错:[警告]服务器与文件内数据的 CASE_SENSITIVE 参数不匹配,成功终止导入, 但出现警告dimp V8,本地编码:PG_GBK, 导入文件编码:PG_UTF8

达梦数据库管理系统的最新版本是8.0版本,简称DM8。DM8采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLTP和OLAP请求,从根本上提升了DM8产品的品质。达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。[警告]服务器与文件内数据的 CASE_SENSITIVE 参数不匹配,成功终止导入, 但出现警告。4.无视警告,输入y,回车。

十三月的博客 1万+

提升JVM性能:CMS垃圾回收器的优化分析与案例研究

本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记,分析了可能导致性能瓶颈的因素如停顿时间过长和内存碎片化。文章还分享了调整垃圾回收参数、结合其他垃圾回收器以及内存优化等方法,帮助提高CMS的回收效率和性能。最后,文章展望了随着JVM发展,结合新一代垃圾回收器优化的趋势,助力Java应用在高并发环境下的性能提升。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

java 设计模式之代理模式

代理模式(Proxy Pattern)是一种经典的设计模式,它提供了一个代理对象来控制对另一个对象的访问。代理模式主要解决的是对象直接的业务关系,即将行为请求和行为实现分离出来,以达到增强类的功能的目的。

melck的博客 357

关于DEJA_VU3D - Cesium功能集专栏说明

专栏主要目的是对工作中基于Cesium实现过的功能进行整合,暂时打算一周2-3更的样子来更新,每一篇都会奉上完整源代码(尽可能把代码简洁一些)。功能实现大多数是自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的更新。..........................................

总得学点什么的博客 2万+

java设计模式之代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 模式介绍: 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些曹祖需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象

li_w_ch的博客 209

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java23种设计模式之代理模式的学习

源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23种设计的模式的各种实现方式以及应用场景,非常适用于学习以及提高我们的设计思维,如果对大家有所帮助,请记得star一下给予作者一定的精神支持,你的star是我写出更好的博客的动力,谢谢大家。 代理模式(proxy pattern) 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种..

weixin_43246215的博客 2202

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

图解Java设计模式之代理模式

图解Java设计模式之代理模式代理模式的基本介绍静态代理模式的基本介绍应用实例静态代理优缺点动态代理模式的基本介绍JDK中生成代理对象的API动态代理应用实例 代理模式的基本介绍 1)代理模式 :为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是 :可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2)被代理的对象可以是远程对象、创建开...

不一样的花朵的博客 513

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Java设计模式】代理模式

【Java设计模式】代理模式 1、Java代理模式的基本介绍 首先得跟大家说明白,本篇文章的设计模式实现是基于Java语言的,思想还是代理的思想,不要纠结于我为什么将静态代理,动态代理,cglib代理分开来说(只能说技术是技术,思想是思想) 代理模式:为一个对象提供一个替身,以控制对这个对象的访问;即通过代理对象访问目标对象;这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能; 被代理的对象可以是远程的对象、开销大的对象或者需要被安全控制保护的对象; Java的手段实现代理模

weixin_39915192的博客 2167

Java设计模式-代理模式

Java设计模式-代理模式 什么是代理模式? 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 所谓的代理严格来讲就是两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个辅助完成主类业务逻辑操作。 代理模式 UML图: 源代码: interface ISubject{//操作主题 public void get();//要钱 } class RealSubject imp

Java厂长 5864

代理模式——举例说明Java23种设计模式中的代理模式

代理模式——举例说明Java23种设计模式中的代理模式1. 概述1.1 定义1.2 组成部分2. 静态代理2.1 引出代理模式的一个简单业务场景2.2 静态代理例子1:2.3 静态代理例子2:3. 动态代理3.1 JDK代理(接口代理)3.1.1 JDK动态代理例子13.1.2 JDK动态代理例子2分析3.1.3 JDK动态代理例子33.2 Cglib 代理4. 附代码4.1 静态代理代码4.1 例子1代码4.2 例子2代码4.2 动态代理代码4.1 JDK 动态代理4.1.1 JDK 动态代理例子14.1

@素素~的博客 1989

Java设计模式之代理模式

设计模式 在说代理模式之前先说说什么是设计模式吧。 简单来说设计模式就是用来解决不同问题的一种思路。这就很好理解了,就不如说你遇到了不同的问题,每个问题都有每个问题的解决方法。 代理模式 既然设计模式是用来解决不同问题的,那么接下来就来讲讲代理模式主要是用来解决什么问题的吧。 代理模式的意义在于能够帮助被代理对象做更多的事情,而不去破坏原先的代码结构。这里主要是在特定的业务环境中...

qq_40585236的博客 285

Java设计模式——代理模式

Java设计模式——代理模式 一、代理模式的特点:两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。(两个子类实现一个接口,一个类干事情,另一个类辅助它干事情) 二、代理模式的实例:   1、接口:买电脑   2、真实主题类:你要买电脑   3、代理类:代购 三、代理模式的应用:Spring-AOP ...

xiaoaxiao 336

JAVA设计模式——代理模式

JAVA设计模式——代理模式 一.主要概念 1.定义 代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用 代理对象启到一个中介作用,它用于连接客户端和目标对象 2.静态代理与动态代理 (1)静态代理 由程序员创建代理类,在程序运行之前,该类就被编译了 优点 方便对目标对象进行功能扩展 缺点 系统新增一个服务,就需要新增一个代理对象!重用性不强 (2)动态代理 动态代理:在程...

a158s168的博客 210
上一篇: 读-秦小波-编写高质量代码:改善java程序的151个建议
下一篇: JAVA设计模式之原型模式
有志青年L
博客等级 码龄10年 30粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值