Java描述设计模式(16):代理模式
本文源码:GitHub·点这里 || GitEE·点这里
一、生活场景
1、场景描述
在电商高速发展的今天,快递的数量十分庞大,甚至出现了快递代理行业,简单的说就是快递的主人没有时间收快递,会指定一个快递的代收点,比如快递柜,快递驿站等,然后等有时间的时候再过去取,下面使用代码对这个场景进行简单的描述。
2、场景图解

3、源码实现
public class C01_InScene {
public static void main(String[] args) {
/*自己收快递的测试方式*/
GetExpress getExpress = new GetExpress();
getExpress.sureInfo();
getExpress.signName("张三");
/*代收快递的测试方式*/
ExpressAct getUser = new GetExpress();
ExpressAct getProxy = new ProxyExpress(getUser);
getProxy.sureInfo();
getProxy.signName("李四");
}
}
/**
* 接收一个快递的动作接口:确认信息,签名
*/
interface ExpressAct{
void sureInfo();
void signName(String name);
}
/**
* 定义一个类接收快递:自己去拿快递
*/
class GetExpress implements ExpressAct{
@Override
public void sureInfo() {
System.out.println("请确认你的个人信息!");
}
@Override
public void signName(String name) {
System.out.println("你的名字是:"+name);
}
}
/**
* 定义一个类接收快递:找人代领快递
*/
class ProxyExpress implements ExpressAct{
private ExpressAct expressAct=null;
public ProxyExpress(ExpressAct expressAct){
this.expressAct = expressAct;
}
@Override
public void sureInfo() {
this.expressAct.sureInfo();
}
@Override
public void signName(String name) {
this.expressAct.signName(name);
}
}
二、代理模式
1、概念描述
代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。所谓代理,就是一个对象代表另一个对象执行相应的动作程序。而代理对象可以在客户端和目标对象之间起到中介的作用。
2、模式图解

3、核心角色
- 抽象对象角色
声明目标对象和代理对象的共同接口。
- 目标对象角色
定义了代理对象所代表的目标对象。
- 代理对象角色
代理对象内部含有目标对象的引用,可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象,AOP编程就是基于这个思想。
4、源码实现
public class C02_Proxy {
public static void main(String[] args) {
AbstractObject object = new ProxyObject();
object.operation();
}
}
/**
* 抽象对象角色
*/
abstract class AbstractObject{
public abstract void operation();
}
/**
* 目标对象角色
*/
class TargetObject extends AbstractObject{
@Override
public void operation() {
System.out.println("Target Method Run...");
}
}
/**
* 代理对象角色
*/
class ProxyObject extends AbstractObject{
TargetObject targetObject = new TargetObject();
@Override
public void operation() {
System.out.println("Method Before...");
targetObject.operation();
System.out.println("Method After...");
}
}
三、JDK动态代理
基于JDK动态代理方式实现AOP切面编程。
1、代码实现
public class C03_JdkProxy {
public static void main(String[] args) {
BookService bookService = BookAopProxyFactory.createService() ;
System.out.println(bookService.getBook());
}
}
class BookAspect {
public void before (){
System.out.println("Method Before ...");
}
public void after (){
System.out.println("Method After ...");
}
}
interface BookService {
String getBook () ;
}
class BookServiceImpl implements BookService {
@Override
public String getBook() {
System.out.println("目标方法【getBook】被执行");
return "高性能MySQL";
}
}
class BookAopProxyFactory {
public static BookService createService() {
// 目标类
final BookService bookService = new BookServiceImpl() ;
// 切面类
final BookAspect bookAspect = new BookAspect();
/*
* 代理类:将目标类(切入点)和 切面类(通知) 结合
*/
BookService proxyBookService = (BookService) Proxy.newProxyInstance(
BookAopProxyFactory.class.getClassLoader(),
bookService.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// 前执行
bookAspect.before();
// 执行目标类的方法
Object obj = method.invoke(bookService, args);
// 后执行
bookAspect.after();
return obj;
}
});
return proxyBookService ;
}
}
四、几种常见代理
- 防火墙代理
内网通过代理穿透防火墙,实现对公网的访问。
- 缓存代理
为了缓解网站并发压力,在请求数据库资源时,先取缓存中代理的数据,如果缓存未命中,再到数据库取数据,然后缓存取到的数据。
- 远程代理
远程对象的本地代理对象,通过它可以把远程对象当本地对象调用 。远程代理通过网络和调用的远程对象进行信息交互 。
- 同步代理
主要使用在多线程编程中,完成多线程间同步工作。
五、源代码地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(16):代理模式的更多相关文章
- Java基础-设计模式之-代理模式Proxy
代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...
- 基于JAVA的设计模式之代理模式
概念 王宝强有一个经纪人叫宋喆,这个经纪人很吊,可以代理王宝强做一系列的事情,与粉丝活动.王宝强的微博维护.安排王宝强的行程以及什么什么等等.如果王宝强一个人做岂不是累死.通过这个代理人为王宝强节省了 ...
- Java常见设计模式之代理模式
指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其它相关业务的处理.比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...
- Java设计模式:代理模式(转)
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...
- java设计模式6——代理模式
java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...
- 理解java的三种代理模式
代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...
- C#设计模式(13)——代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
随机推荐
- [scikit-learn] 特征二值化
1.首先造一个测试数据集 #coding:utf-8 import numpy import pandas as pd from sklearn.preprocessing import OneHot ...
- 品Spring:SpringBoot和Spring到底有没有本质的不同?
现在的Spring相关开发都是基于SpringBoot的. 最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包.如下图13: 使用java -jar命令就可以运行这个独立的j ...
- CentOS 8 都发布了,你还不会用 nftables?
原文链接:CentOS 8 都发布了,你还不会用 nftables? 如果你没有生活在上个世纪,并且是云计算或相关领域的一名搬砖者,那你应该听说最近 CentOS 8 官方正式版已经发布了,CentO ...
- 阿里云服务器CentOS6.9 tomcat配置域名访问
之前一直是ip访问项目,今天申请到一个测试域名,想要用设置用域名访问项目. 1.进入阿里云服务器中,修改tomcat中server.xml文件 cd /usr/local/apache-tomcat/ ...
- Scala Try Catch Finally
Scala Try Catch Finally: 在Java中返回值优先级顺序:finally最高, try,catch 选其一,try中抛异常,返回catch,不抛异常,返回try,. public ...
- 快学Scala 第七课 (类构造函数)
类 主构造器: class Person (var name: String){ } 主构造参数可以不带val或者var,如果没有被其他方法使用,则不保存为字段. 如果被其他方法使用,则被升格为字段, ...
- 软件开发工具(第9章:使用Eclipse进行C/C++开发)
一.安装MinGW MinGW是指用来生成可执行文件的编译环境,它是开发C/C++项目 的工具集.为了能够使用Eclipse CDT编译且运行C和C++程序,必须 要安装一个C/C++编译器. 下载: ...
- 10个值得深思的_PHP_面试问题
Q1 第一个问题关于弱类型 $str1 = 'yabadabadoo'; $str2 = 'yaba'; if (strpos($str1,$str2)) { echo "\"&q ...
- 记录 java 安卓 各类引用包报错处理方法 例如 android.support.v4.app.+ ,io.reactivex.+
可能导致的原因: 1. 引用包不存在(存在也报错就是 版本不对) 2.有资源文件 重名,报错之类的问题 3. 别人提交了资源文件或者配置文件(这是最常见的,特别是新手,我也是),后续遇到再加 解决方法 ...
- B-线性代数-矩阵转置
[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...