设计模式之(十一)代理模式(Proxy)
软件开发行业有一个观点:任务问题都可以添加一个中间层来解决。代理模式也是这个思想下的产物。
首先看下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。就是把类委托给另外一个类,用这个类来控制对原来那个类的访问,例如对权限的控制。来看下类图。

代理分为静态代理和动态代理。接下来我们先看下静态代理。
静态代理
//接口
public interface Human {
public void eat(); public void breath();
} //原来的对象
public class Baby implements Human {
public void eat(){
System.out.println("在吃奶");
} public void breath(){
System.out.println("一刻不停的呼吸!");
}
} //代理类
public class Mom implements Human{
private Human human;
public Mom(){
this.human = new Baby();
} public void eat(){
System.out.println("喂婴儿吃奶!");
human.eat();
} public void breath(){
human.breath();
}
} public class Client {
public static void main(String[] args) {
Human hm = new Mom();
hm.eat();
hm.breath();
}
} -------------------------------------------------------------------------
喂婴儿吃奶!
喜欢吃奶
一刻不停的呼吸!
动态代理
动态代理的例子是利用了上面的例子中的 human 接口和 Baby 类。
//动态代理
public class ProxyMom implements InvocationHandler { private Human human = null; public Human getProxyInterface(Human human1){
this.human = human1;
Human hm = (Human)Proxy.newProxyInstance(human.getClass().getClassLoader(), human.getClass().getInterfaces(), this);
return hm;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub Object methodObj = null;
System.out.println("喂婴儿吃奶!");
methodObj = method.invoke(human, args); return methodObj;
} } public class Client {
public static void main(String[] args) {
ProxyMom pm = new ProxyMom();
Human baby= pm.getProxyInterface(new Baby());
baby.eat();
baby.breath(); }
}
-------------------------------------------------------------------------
喂婴儿吃奶!
在吃奶
喂婴儿吃奶!
一刻不停的呼吸!
1、java 里面动态代理需要实现 InvocationHandler 接口。
2、然后重写 invoke 方法。参数第一个是:代理类对象。第二个是:需要代理的方法、第三个是方法的参数。另外 invoke 是自动被调样的。不需要使用者显示调用。
通过例子我们看出来了,如果是静态代理的话,代理类和原生类都是一对一的。原生类有多少方法,那么代理类基本也需要有相应的方法来代理,这样代理类总是要跟着原生来来变化。当原生类有很多方法的时候,代理类也需要很多方法,非常的不灵活。而动态代理通过 Proxy、InvocationHandler 和 方法 invoke 就结局了这个问题。因为 invoke 能对所以的方法进行统一处理。方便灵活。
java 的动态代理只能代理接口,而如果想要代理类,需要用到 cglib 类库。
代理的典型用例
1、远程代理。2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
通过典型用法也看出来代理模式的本质就是控制对类的访问
代理模式和装饰模式的区别
当然他们在实现上是极为相似的。但是代理模式强调的是对类的访问控制,而装饰模式主要是为了给类动态的增强功能。
设计模式之(十一)代理模式(Proxy)的更多相关文章
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式学习心得<代理模式 Proxy>
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...
- 设计模式入门之代理模式Proxy
//代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问 //实例:鉴于书中给出的样例不太好.并且有些疑问,所以直接用保护代理作为实例 //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单 ...
- 《JAVA设计模式》之代理模式(Proxy)
在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...
- 【转】设计模式(十一)代理模式Proxy(结构型)
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- 代理模式 PROXY Surrogate 结构型 设计模式(十四)
代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...
- 大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
随机推荐
- MNIST数据集上卷积神经网络的简单实现(使用PyTorch)
设计的CNN模型包括一个输入层,输入的是MNIST数据集中28*28*1的灰度图 两个卷积层, 第一层卷积层使用6个3*3的kernel进行filter,步长为1,填充1.这样得到的尺寸是(28+1* ...
- 201777010217-金云馨《面向对象程序设计(java)》第十三周学习
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- C——letterCounter
/* 一个统计字母(含大小写)出现次数的C程序 */ #include <stdio.h> int main() { ]; char ch; /* initialization */ ; ...
- Linux性能优化实战学习笔记:第二十六讲
一.案例环境描述 1.环境准备 2CPU,4GB内存 预先安装docker sysstat工具 2.温馨提示 案例中 Python 应用的核心逻辑比较简单,你可能一眼就能看出问题,但实际生产环境中的源 ...
- 来吧!一文彻底搞定Vue组件!
作者 | Jeskson 来源 | 达达前端小酒馆 Vue组件的概述 组件是什么呢,了解组件对象的分析,Vue组件中的data属性,props传递数据的原理到底是什么. 事件通信的那些事 如何了解父子 ...
- Intellij IDEA通过Plugins导入vue.js
最近再写vue.js的程序,刚开始使用Intellij IDEA没有导入插件,结果所有vue文件都是文本方式显示,无法使用开发工具的辅助功能,导入vue.js插件后即可. 路径是Setting-> ...
- 第22课 weak_ptr弱引用智能指针
一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...
- 基于Kafka的实时计算引擎如何选择?Flink or Spark?
1.前言 目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟.以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象.那么,今天就来聊一聊基于Kafka的实时计算引 ...
- 【RS】Deep Learning based Recommender System: A Survey and New Perspectives - 基于深度学习的推荐系统:调查与新视角
[论文标题]Deep Learning based Recommender System: A Survey and New Perspectives ( ACM Computing Surveys ...
- CUDA编程学习笔记1
CUDA编程模型是一个异构模型,需要CPU和GPU协同工作. host和device host和device是两个重要的概念 host指代CPU及其内存 device指代GPU及其内存 __globa ...