代理模式

Java 动态代理2

独自空忆成欢 提交于 2019-11-27 22:23:46
代理模式是什么 代理模式是一种设计模式,简单说即是在 不改变源码 的情况下,实现对 目标对象 的 功能扩展 。 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing()。 1 public class Singer{ 2 public void sing(){ 3 System.out.println("唱一首歌"); 4 } 5 } 假如你希望,通过你的某种方式生产出来的歌手对象,在唱歌前后还要想观众问好和答谢,也即对 目标对象 Singer的sing方法进行 功能扩展。 1 public void sing(){ 2 System.out.println("向观众问好"); 3 System.out.println("唱一首歌"); 4 System.out.println("谢谢大家"); 5 } 但是往往你又 不能直接对源代码进行修改 ,可能是你希望原来的对象还保持原来的样子,又或许你提供的只是一个可插拔的插件,甚至你有可能都不知道你要对哪个目标对象进行扩展。这时就需要用到java的代理模式了。网上好多用生活中的经理人的例子来解释“代理”,看似通俗易懂,但我觉得不适合程序员去理解。程序员应该从代码的本质入手。 Java的三种代理模式 想要实现以上的需求有三种方式,这一部分我们只看三种模式的代码怎么写,先不涉及实现原理的部分。 1.静态代理 1 public

Java设计模式之代理模式

梦想与她 提交于 2019-11-27 22:19:44
Java设计模式之代理模式 代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?一般是因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的访问。 在现实生活中,这种情形非常的常见,比如请一个律师代理来打官司。 下面例子的代码可以访问 源码 。欢迎star,欢迎fork 代理模式的UML图 从UML图中,可以看出代理类与真正实现的类都是继承了抽象的主题类,这样的好处在于代理类可以与实际的类有相同的方法,可以保证客户端使用的透明性。 代理模式的实现 代理模式可以有两种实现的方式,一种是静态代理类,另一种是各大框架都喜欢的动态代理。下面我们主要讲解一下这两种代理模式 静态代理 我们先看针对上面UML实现的例子,再看静态代理的特点。 Subject接口的实现 public interface Subject { void visit(); } 实现了Subject接口的两个类: public class RealSubject implements Subject { private String name = "byhieg"; @Override public void visit() { System.out.println

Spring 核心技术(6)

删除回忆录丶 提交于 2019-11-27 20:58:48
接上篇: Spring 核心技术(5) version 5.1.8.RELEASE 1.5 Bean 作用域 创建 bean 定义时,你创建了一种用于创建 bean 定义中定义的类实例的方法。bean定义的设想是一个很重要的方法,因为它意味着,与一个类一样,你可以从以一种方式创建许多对象实例。 你不仅可以控制要插入到以特定 bean 定义创建的对象中的各种依赖项和配置值,还可以控制以特定bean定义创建的对象的作用域。这种方法功能强大且灵活,因为你可以选择通过配置创建的对象的作用域,而不必在 Java 类级别设定对象的作用域。Bean 可以被部署到定义的多个作用域之一中。Spring Framework 支持六个作用域,其中四个范围仅在使用支持 Web 的 ApplicationContext 时可用。你还可以创建 自定义范围 。 下表描述了支持的作用域: 作用域 描述 单例 (默认)将单个 bean 定义的作用域限定为每个 Spring IoC 容器的单个对象实例。 原型 将单个 bean 定义作用域限定为任意数量的对象实例。 请求 将单个 bean 定义作用域限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,它是在单例 bean 定义的后面创建的。仅在支持 web 的 Spring ApplicationContext 中可用。

代理(Proxy)设计模式

对着背影说爱祢 提交于 2019-11-27 19:07:48
代理(Proxy)设计模式 1.0.0 代理模式产生的背景 系统都具有核心,核心代码是实现功能的basic。 在一些情况下,为了满足业务的需求,我们需要对原有的核心进行加强 after() before()等前置后置甚至是环绕的方法。 1.0.1 对原有类进行加强的方式 一种解决方式是通过继承,override,加强或者变换核心的实现。 通过代理的模式,对要修改的核心进行修改或者变换已达到对对象加强的操作。 1.0.2 为什么要是用代理类来进行加强? 继承会暴露父类的接口或者函数 代理可以封装多个不同的对象,完整的解决对象。 代理可以选用参数的方法来实现功能,不会暴露父类的任何接口或者函数,封装性比较好。这是在语言上说的,当然,通过反射等不同的操作途径,都可以读取类的函数。 2.0.0 代理模式的定义 代理模式通过给对象A创建一个代理对象B,B中含有A的引用,进而控制A行为的模式。 现实中的例子:A因为劳动问题将B上诉至法庭,A不太懂法律,需要C去帮A进行代理,以便达到最好的效果。 ```java Class A{ public void 准备材料(){} public void 吃饭(){} public void 睡觉(){} } Class C{ private A a; public C(A a){this.a=a;} public void 上诉(){获取材料()

23种设计模式

*爱你&永不变心* 提交于 2019-11-27 18:00:46
目录 创建型 1. Factory Method (工厂方法) 2. Abstract Factory (抽象工厂) 3. Builder (建造者) 4. Prototype (原型) 5. Singleton (单例) 结构型 6. Adapter Class/Object (适配器) 7. Bridge (桥接) 8. Composite (组合) 9. Decorator (装饰) 10. Facade (外观) 11. Flyweight (享元) 12. Proxy (代理) 行为型 13. Interpreter (解释器) 14. Template Method (模板方法) 15. Chain of Responsibility (责任链) 16. Command (命令) 17. Iterator (迭代器) 18. Mediator (中介者) 19. Memento (备忘录) 20. Observer (观察者) 21. State (状态) 22. Strategy (策略) 23. Visitor (访问者) 创建型 1. Factory Method (工厂方法) 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使 一 个类的实例化延迟到其子类。 适用性: 当一个类不知道它所必须创建的对象的类的时候。

jmeter性能测试学习笔记3-使用jmeter 4.0+IE浏览器录制脚本

↘锁芯ラ 提交于 2019-11-27 16:58:09
之前有记录过用bodbay这个地三方的插件来录制脚本,然后想了一下用jmeter本身来录制脚本,网上有很多人说jmeter录制的脚本会不稳定,当然,大家也可以用第三方插件录制,下面用jmeter 4.0的版本来录制脚本,然后实现压力测试。 录制前提: 1、下载好jmeter 4.0工具 (jemter3.0也可以录制,只是和jmeter4.0的区别在于UI发生了一点改变) 2、IE浏览器(能正常联网) 一、打开jmeter 4.0 1、添加线程组:点击测试计划,右键添加 2、添加代理服务器:点击测试计划->添加->非测试元件->HTTP代理服务器 PS:jemter3.0版本的添加方法是点击工作台添加 添加之后,页面如下: 端口可以是8888,也可以是其它的,只要不要和程序的端口有冲突就行。 3、添加录制控制器:点击线程组,右键添加 录制控制器页面如下:例如录制百度新闻页面,给录制控制器改了名字 然后点击HTTP代理服务器,切换到代理服务器配置界面,修改以下两处红圈位置。选择录制控制器 4、添加HTTP cookies 管理器:一定要添加这个,不然录制的时候会报错。 5、jmeter的相关设置好之后,下面设置代理浏览器(本文采用IE浏览器做例子,其它浏览器会下章记录) 6、打开IE浏览器属性,设置代理 局域网设置页面如下: 录制什么脚本就把地址给粘贴进去

java 基础篇

情到浓时终转凉″ 提交于 2019-11-27 15:37:16
集合类:   collection:集合类的父接口,集合长度不固定,数组长度固定     add()-添加元素     addAll()-添加集合元素     clear()-清空处理     contains()-是否包含     equals()-重写obj的方法,判断对象是否相等     hashcode()-重写obj的方法,判断对象的哈希码是否相等     isEmpty()-判空     iterator()-返回迭代器Iterator,hasNext() 以及next()进行迭代     remove()-移除某元素     size()-返回集合元素大小     toArray()-转为数组   list:     add(index,xxx)-指定位置添加元素     addAll(index,xxx)-指定位置添加集合元素     get(index)-返回指定位置元素     indexOf(obj)-某元素在集合中的下标     lastIndexOf(obj)-某元素在集合中最后出现的下标     remove(index)-移除指定位置元素     set(index,obj)-替换指定位置元素     subList(from,to)-返回当前下标区间元素     sort(Comparator)-根据排序参数排序     toArray()-转为数组

代理模式——动态代理

寵の児 提交于 2019-11-27 15:16:03
  动态代理其实现主要通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler接口。   步骤如下:   1、 首先获取一个业务接口的实现对象 2、 获取一个 InvocationHandler 实现 3、 创建动态代理对象   4、通过动态代理对象调用方法   业务接口 package com.flyoung;public interface HelloWorld { public void sayHello();}   业务接口实现 package com.flyoung;public class HelloWorldIml implements HelloWorld { public void sayHelloWorld() { System.out.println("Hello World!!!"); }}   InvocationHandler实现类 package com.flyoung;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class HelloWorldHandler implements InvocationHandler { private Object

java设计模式(1)--代理模式及动态代理类

十年热恋 提交于 2019-11-27 15:15:04
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到的角色有: 抽象角色 :声明真实对象和代理对象的共同接口; 代理角色 :代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 真实角色 :代理角色所代表的真实对象,是我们最终要引用的对象。 适用环境:要获得已经初始化的对象又不能有具体的获得途径时适用。 以下以《Java与模式》中的示例为例: 抽象角色: abstract public class Subject { abstract public void request(); } 真实角色:实现了Subject的request()方法。 public class RealSubject extends Subject { public RealSubject() { } public void request() { System.out.println( " From real subject. " ); } } 代理角色: public class ProxySubject

代理模式【介绍、静态代理、动态代理、入门、应用】

99封情书 提交于 2019-11-27 15:14:52
代理介绍 代理(Proxy)是一种设计模式, 提供了对目标对象 另外的访问方式 ;即 通过代理访问目标对象 。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。 可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。 简单理解代理 很简单举个例子: 现在我是一个明星,拥有很多粉丝。粉丝希望我唱歌给他们听,但是如果都是我来接应他们,我岂不是很忙….于是乎,我就去找了个经纪人。这个 经纪人就代表了我 。当粉丝想要我唱歌的时候,应该是找经纪人,告诉经纪人想让我唱歌。 现在我越来越红了,不是粉丝想要我唱歌,我就唱了。我要收费了。但是呢,作为一个公众人物,不可能是我自己说:我要收10000万,我才会去唱歌。于是这就 让经纪人对粉丝说:只有10000万,我才会唱歌。 无论外界是想要我干什么,都要经过我的经纪人。我的 经纪人也会在其中考虑收费、推脱它们的请求。 经纪人就是代理,实际上台唱歌、表演的还是我 静态代理 直接使用例子来说明吧…现在我 有一个IUserDao的接口,拥有save方法() // 接口 public interface IUserDao { void save(); } UserDao实现该接口,重写save()方法 public class UserDao implements IUserDao{ @Override public