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)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
随机推荐
- /bin/java: 没有那个文件或目录spark/bin/spark-class:行71: /usr/java/jdk1.8
1.检查java环境有没有问题 2.1没问题后检查文件的编码是否有问题
- java 数组定义
1.方式一: 数组声明: int[] intArr ; String [] strArr; int [][] intArrs; 数组初始化: intArr = new int[6]; //一维数组 s ...
- 字符串转数字(with Java)
1. 字符串中提取数字 两个函数可以帮助我们从字符串中提取数字(整型.浮点型.字符型...). parseInt().parseFloat() valueOf() String str = " ...
- supervisor 启动ElasticSearch报错问题
在/etc/elasticsearch/conf.d/新建一个es的配置文件,elasticsearch.conf,这里碰到一个小坑,网上很多文章介绍的是elasticsearch.ini,启动发现找 ...
- 基于djiango实现简易版的图书管理系统
介绍: 本程序仅仅实现图书数据的增删查 树形结构如下 全部代码如下: url: from django.urls import path from front import views as fr ...
- Spring 梳理-运行时动态注入bean
动态注入的方法 使用占位符 使用Spring表达式
- 一个低级错误引发Netty编码解码中文异常
前言 最近在调研Netty的使用,在编写编码解码模块的时候遇到了一个中文字符串编码和解码异常的情况,后来发现是笔者犯了个低级错误.这里做一个小小的回顾. 错误重现 在设计Netty的自定义协议的时候, ...
- C/C++中变量的作用域和存储类型简介
写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概 ...
- Eureka参数配置->Client端参数
1.基本参数配置列表: 参数 默认值 说明 eureka.client.availability-zones 告知client有哪些region及availability-zones,支持配置 ...
- 关于win10、ubuntu双系统安装的 geom erro错误
安装参考这个博客:http://blog.csdn.net/pop_rain/article/details/70477085 只记录安装ubuntu过程遇到的问题: 1.分区不可用(分区按以下设置) ...