设计模式之代理模式
时间:2022-04-29
本文章向大家介绍设计模式之代理模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式是一种注重过程的一种模式,在我们做某一具体事情之前或之后做一些辅助性的工作; 好处是将辅助工作从主要工作中抽离出来,但是又能协同工作, 我们只关心主要业务,对于不关心的事情交给代理来做,实现代理需要两个对象:被代理者,执行者
JDK中提供的动态代理(只能代理接口):
public interface IBuy {
void pay();
}
public class Buy implements IBuy{
@Override
public void pay() {
System.out.println("订单支付完成!");
}
public class PayProxy implements InvocationHandler {
private Object obj;
public PayProxy(Object target) {
this.obj = target;
}
public Object newInstance() {
Class<? extends Object> cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = method.invoke(obj, args);
System.out.println("----------");
sendMsg();
return res;
}
private void sendMsg(){
System.out.println("买家已付款,请尽快发货!");
}
}
--------------
IBuy buy = (IBuy)new PayProxy(new Buy()).newInstance();
buy.pay();
console:
订单支付完成!
----------
买家已付款,请尽快发货!
CGLIB方式(代理具体类):
public class Buy{
public void pay() {
System.out.println("订单支付完成!");
}
}
public class CglibPayProxy implements MethodInterceptor {
private static final CglibPayProxy PROXY = new CglibPayProxy();
private CglibPayProxy() {
}
public static CglibPayProxy getInstance() {
return PROXY;
}
@SuppressWarnings("unchecked")
public <T> T newProxy(Class<T> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return (T) enhancer.create();
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3)
throws Throwable {
Object res = arg3.invokeSuper(arg0, arg2);
System.out.println("------------");
sendMsg();
return res;
}
private void sendMsg() {
System.out.println("买家已付款,请尽快发货!");
}
Buy buy = CglibPayProxy.getInstance().newProxy(Buy.class);
buy.pay();
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- nmap
- MSF基础与应用
- Windows系统组件漏洞
- 【风险通告】FastAdmin会员中心Getshell漏洞
- Azure Cosmos DB介绍及演示
- 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta
- 《一起学sentinel》一、一起搭建sentinel服务
- InfluxDB和Grafana实现传感器数据的存储和可视化
- 样本相关性分析
- Android 序列化 Serializable与Parcelable
- 《一起学sentinel》二、初探sentinel的Slot
- Redis突然报错,今晚又不能回家了...
- 查询ElasticSearch:用SQL代替DSL
- Java开源框架中的设计模式以及应用场景
- 统一定制API返回格式,我只做了这几件事