`
linliuwei
  • 浏览: 33155 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

设计模式学习笔记(代理模式)

阅读更多
代理模式(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

0
1
分享到:
评论

相关推荐

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    尚硅谷设计模式源码笔记课件.zip

    2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    C#设计模式学习笔记

    以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...

    设计模式学习笔记及其模式特点总结

    这些文档涵盖了设计模式的基础知识,通过阅读和学习,你可以深入了解每种模式的原理、应用场景及其实现方式,从而提升你的软件设计能力。绘图1.vsd可能是用于描绘设计模式的UML类图或其他图表,它能直观地展示各对象...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    java设计模式学习笔记,以及各种模式的代码实现

    9. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。它可以用于远程代理、虚拟代理、缓存等。 10. **桥接模式**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种设计模式属于结构型...

    #资源大人分享计划# 设计模式学习笔记.rar

    在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...

    设计模式学习笔记

    设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    设计模式笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    《C++20设计模式》学习笔记-第12章代理模式-配套代码

    《C++20设计模式》学习笔记-第12章代理模式-配套代码

    根据《JAVA与设计模式》整理的笔记及示例代码

    这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

Global site tag (gtag.js) - Google Analytics