一. 简介
代理模式(Proxy Pattern)是23种Java常用设计模式之一。
代理模式的定义:Provide a surrogate or placeholder for another 用代理模式创建代理对象,让代object to controlaccess to it
(为其他对象提供一种代理以控制对这个对象的访问)。使理对象控制目标
对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目
标对象的情况下添加一些额外的功能。
二、静态代理
1、首先创建一个借口 Humam,规定有唱歌,跳舞,吃饭三件事情
Middleman有对这个Human做出了一些规定。
5、运行结果如下:
三、动态代理
1、2步 。同上
3、不需要代理类,在这个代码运行期间,动态的规定这些方法的实现。
代理模式(Proxy Pattern)是23种Java常用设计模式之一。
代理模式的定义:Provide a surrogate or placeholder for another 用代理模式创建代理对象,让代object to controlaccess to it
(为其他对象提供一种代理以控制对这个对象的访问)。使理对象控制目标
对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目
标对象的情况下添加一些额外的功能。
二、静态代理
1、首先创建一个借口 Humam,规定有唱歌,跳舞,吃饭三件事情
public interface Human {
void sing(float money);
void dance(float money);
void eat();
}
2、然后让一个人去实现这些功能
public class Person implements Human {
public void sing(float money) {
System.out.println("拿到钱"+money+"开始唱歌");
}
public void dance(float money) {
System.out.println("拿到钱"+money+"开始跳舞");
}
public void eat() {
System.out.println("吃饭");
}
3、静态代理就是创建出一个具体的代理类,通过这个代理类,去实现接中规定的方法,这里给Person设计一个经纪人MiddlemanMiddleman有对这个Human做出了一些规定。
public class Middleman implements Human {
private Human h;
public Middleman(Human h) {
this.h = h;
}
public void sing(float money) {
if(money>1000){
h.sing(money/2);
}
}
public void dance(float money) {
if(money>2000){
h.dance(money/2);
}
}
public void eat() {
h.eat();
}
}
4、测试
public static void main(String[] args){
Human h = new Person();
Human middleMan = new Middleman(h);
middleMan.sing(10000);
middleMan.dance(20000);
middleMan.eat();
}
5、运行结果如下:
拿到钱5000.0开始唱歌
拿到钱10000.0开始跳舞
吃饭
三、动态代理
1、2步 。同上
3、不需要代理类,在这个代码运行期间,动态的规定这些方法的实现。
public static void main(String[] args){
//动态代理
final Human h = new Person();
/**
* ClassLodder loader: 类加载器 和Person用相同的类
* Inferface[] interfaces Person用相同的接口
* InvocatoinHandler h :接口,设置代理,策略设计模式
*
*/
Human middleman = (Human) Proxy.newProxyInstance(h.getClass().getClassLoader(),
h.getClass().getInterfaces(), new InvocationHandler() {
//匿名内部类:具体策略
//只要执行任何方法,都会经过这里
/*
* 返回值:当前方法的返回值
* Object proxy:当前代理对象的引用
* Method method:当前执行的方法
* Object[] args 当前执行方法的参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("sing".equals(method.getName())){
float money = (Float) args[0];
if(money>1000){
method.invoke(h, money/2);
}
}
if("dance".equals(method.getName())){
float money = (Float) args[0];
if(money>2000){
method.invoke(h, money/2);
}
}
if("eat".equals(method.getName())){
method.invoke(h, null);
}
return null;
}
});
middleman.sing(10000);
middleman.dance(20000);
middleman.eat();
}
4、运行结果:
拿到钱5000.0开始唱歌
拿到钱10000.0开始跳舞
吃饭