代理模式(Proxy)
为其他对象提供一种代理机制以控制对这个对象的访问。
代理模式的应用
1) 远程代理:为一个对象在不同的地址空间提供代理,如WebService, Java RMI, Caucho Hessian
2) 虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,如:Web代理服务器,反向代理Nginx, Squid
3) 其他代理:如控制真实对象的访问权限,计算真实对象的调用次数,记录日志、AOP事务处理等
一个简单的AOP事务处理代码(使用JDK动态代理实现)
package test.gof.proxy;
import test.gof.factory.Item;
//商品服务
public interface ItemService {
int addItem(Item item);
}
package test.gof.proxy;
import test.gof.factory.Item;
import test.gof.factory.ItemDAO;
import test.gof.factory.ItemDAOMySQLImpl;
import test.gof.factory.UserDAO;
import test.gof.factory.UserDAOMySQLImpl;
//商品服务逻辑实现
public class ItemServiceImpl implements ItemService {
private ItemDAO itemDAO = new ItemDAOMySQLImpl();
private UserDAO userDAO = new UserDAOMySQLImpl();
@Override
public int addItem(Item item) {
//添加一个商品,同时更新用户的商品总数
int result = itemDAO.insert(item);
userDAO.updateItemCount(item.getUserId(), 1);
return result;
}
public void setItemDAO(ItemDAO itemDAO) {
this.itemDAO = itemDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
package test.gof.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//事务模板
public class TransactionHandler implements InvocationHandler {
private Object proxyObj;//被代理的对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
System.out.println("start transaction");
result = method.invoke(proxyObj, args);
System.out.println("commit transaction");
} catch (Exception e) {
System.out.println("rollback transaction");
e.printStackTrace();
}
return result;
}
public void setProxyObj(Object proxyObj) {
this.proxyObj = proxyObj;
}
}
package test.gof.proxy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
import sun.misc.ProxyGenerator;
import test.gof.factory.Item;
public class TestReflect {
@Test
public void testProxy() {
Item item = new Item();
item.setUserId(1);
item.setItemName("hello kitty");
ItemService proxy = (ItemService) this.getProxy(new ItemServiceImpl(), new TransactionHandler());
proxy.addItem(item);
}
/**
* @param proxyObj 代理对象
* @param handler 事务模板
* @return
*/
public Object getProxy(Object proxyObj, TransactionHandler handler) {
handler.setProxyObj(proxyObj);
return Proxy.newProxyInstance(proxyObj.getClass().getClassLoader(), proxyObj.getClass().getInterfaces(), handler);
}
@SuppressWarnings("unchecked")
@Test
public void testProxyGenerator() {
//生成的代理类文件,可以用jad反编译查看源码
String proxyName = "ItemServiceProxy";
ItemServiceImpl impl = new ItemServiceImpl();
Class[] interfaces = impl.getClass().getInterfaces();
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces);
File file = new File("classes/ItemServiceProxy.class");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(proxyClassFile);
fos.flush();
fos.close();
System.out.println("ItemServiceProxy: " + file.getAbsolutePath());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
testProxy执行结果
start transaction
insert item to MySQL
update itemCount to MySQL
commit transaction
分享到:
相关推荐
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...
这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...
2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...
这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...
以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...
这些文档涵盖了设计模式的基础知识,通过阅读和学习,你可以深入了解每种模式的原理、应用场景及其实现方式,从而提升你的软件设计能力。绘图1.vsd可能是用于描绘设计模式的UML类图或其他图表,它能直观地展示各对象...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
9. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。它可以用于远程代理、虚拟代理、缓存等。 10. **桥接模式**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种设计模式属于结构型...
在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...
设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。
### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...
这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...
《C++20设计模式》学习笔记-第12章代理模式-配套代码
这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...