代理设计模式
【摘要】
静态代理
抽象角色 : 一般使用接口或者抽象类来实现真实角色 : 被代理的角色,继承与抽象类代理角色 : 代理真实角色 一般会做一些附属的操作 .类似于角色增强客户 : 主函数,使用代理角色来进行一些操...
静态代理
- 抽象角色 : 一般使用接口或者抽象类来实现
- 真实角色 : 被代理的角色,继承与抽象类
- 代理角色 : 代理真实角色 一般会做一些附属的操作 .类似于角色增强
- 客户 : 主函数,使用代理角色来进行一些操作
抽象角色
public interface Singer {
/**
* 歌星都能唱歌
*/
void sing();
}
- 1
- 2
- 3
- 4
- 5
- 6
真实角色
public class MaleSinger implements Singer{
private String name;
public MaleSinger(String name) {
this.name = name;
}
@Override
public void sing() {
System.out.println(this.name + "开始唱歌了!");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
代理角色
public class Agent implements Singer {
private Singer singer;
public Agent(Singer singer) {
this.singer = singer;
}
@Override
public void sing() {
System.out.println("节目组找过来!需要演出,谈好演出费用。。。。。");
singer.sing();
System.out.println("结算费用,下一次合作预约。。。。。。");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
客户
public class Client {
public static void main(String[] args) {
Singer singer = new MaleSinger("鹿晗");
Singer agent = new Agent(singer);
agent.sing();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
鹿晗还是鹿晗,没有必要为了一下前置后置工作改变鹿晗这个类
公共的统一问题交给代理处理
公共业务进行扩展或变更时,可以更加方便
这不就是更加符合开闭原则,单一原则吗?
每个类都写个代理,麻烦死了。
动态代理
- 动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
- 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
- 基于接口的动态代理----JDK动态代理
- 基于类的动态代理–cglib(有兴趣自己研究)
jdk动态代理
【InvocationHandler:调用处理程序】
Object invoke(Object proxy, 方法 method, Object[] args);
//参数
//proxy - 调用该方法的代理实例
//method -所述方法对应于调用代理实例上的接口方法的实例。方法对象的声明类将是该方法声明的接口,它可以是
代理类继承该方法的代理接口的超级接口。
//args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。原始类型的参数包含
在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
【Proxy : 代理】
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
rent.getClass().getInterfaces(),this);
}
- 1
- 2
- 3
- 4
- 5
- 6
代码实现
package prox.Dprox;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Agent implements InvocationHandler {
private Singer singer;
public Agent(Singer singer) {
this.singer=singer;
}
/**
* 设置代理的经济人
* @param singer
*/
public void Agent(Singer singer) {
this.singer = singer;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("---------------经纪人把把关--------------");
Object returnObj = method.invoke(singer, args);
System.out.println("---------------唱完了收收钱------------------------");
return returnObj;
}
/**
* 获取一个代理对象
* @return
*/
public static Object getProxy(Singer singer){
Agent agent = new Agent(singer);
return Proxy.newProxyInstance(Agent.class.getClassLoader(),singer.getClass().getInterfaces(),agent );
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
package prox.Dprox;
public class Client {
public static void main(String[] args) {
Singer singer= new MaleSinger("刘德华");
Singer agent= (Singer)Agent.getProxy(singer);
agent.sing();
Singer singer1= new MaleSinger("张学友");
Singer agent1= (Singer)Agent.getProxy(singer1);
agent1.sing();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
文章来源: hiszm.blog.csdn.net,作者:孙中明,版权归原作者所有,如需转载,请联系作者。
原文链接:hiszm.blog.csdn.net/article/details/111150961
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)