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 之 代理模式 代理模式 阅读详情

相关推荐

『n8n』初识界面

在首页(Overview),我们和 n8n 最常打交道的是“Workflows”、“Credentials”、“Executions”这几个面板(其实后面2个也会用到,但初学阶段可以先不管)。Workflows 面板可以看到我们创建的所有工作流,所以要给工作流起一个一眼看上去就知道是干嘛的名字。

weixin_39415598的博客 1459

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

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

Carson带你学Android 6万+

DM达梦数据库远程客户端工具连接6001错误,disql可以正常连接

DM达梦数据库远程客户端工具连接6001错误,disql可以正常连接

weixin_45906061的博客 4509

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

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

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

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2023

极具性价比的步进电机驱动芯片-TMC2226/TMC2209使用小结

TMC2226/2209相对于TMC2660C、TMC5160来说,价格低了很多,同时功能并没有太多阉割。对比TMC5160,少了内部加减速曲线,电流足够(Ipeak = 2.8A),相对5160而言功能也很足够,所以毫无疑问TMC2226是极具性价比的步进驱动芯片。

Trinamic_TMC的博客 6996

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

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

蛋蛋淡淡定的庄园 299

用SimaPro做碳足迹分析:手把手教你完成产品生命周期评估报告

本文详细介绍了如何使用SimaPro进行碳足迹分析,从软件安装到生命周期评估报告的完整流程。通过实战案例演示,帮助制造业企业、咨询机构和科研团队掌握产品生命周期评估(LCA)的核心技术,精准识别环境热点并优化决策,为可持续发展转型提供科学依据。

yhn45678901的博客 712

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

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

ZaneLove's blog 1075

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

perseverance51博客 2892

极智AI | 算能SC5+智算卡驱动安装与升级

大家好,我是极智视界,本文介绍一下 算能SC5+智算卡驱动安装与升级

极智视界 1276

java 设计模式之代理模式

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

melck的博客 357

[QMT量化交易小白入门]-八十九、深度学习训练多维特征进行金融价格行情预测

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 218

java设计模式之代理模式

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

li_w_ch的博客 209

visio安装包

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

weixin_43246215的博客 2202

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

不一样的花朵的博客 513

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【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、付费专栏及课程。

余额充值