`

设计模式之——代理模式(动态代理)

阅读更多

接口实现类:

动态代理产生工厂类。

调用类:

输出结果:

before calling public abstract void proxypackage.HelloService.echoMessage(java.lang.String)
echo:good
after calling public abstract void proxypackage.HelloService.echoMessage(java.lang.String)

在动态代理产生工厂里面应用了反射机制。

 

下面为静态代理与动态代理测试类:

/**
 * 
 */
package com.lwf.exception;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TestProxy {
	public static void main(String[] args) {
		HelloServiceProxy helloServiceProxy = new HelloServiceProxy(new HelloServiceImpl());
		helloServiceProxy.echoMessage("3333");
		helloServiceProxy.printMsg();
		
		System.out.println("--------------------------------------------------");
		
		HelloService ser = HelloServiceDyProxy.getHelloServiceProxy(new HelloServiceImpl());
		ser.echoMessage("eeee");
		ser.printMsg();
		
	}
}

interface HelloService{
	public String echoMessage(String msg);
	public void printMsg();
}

class HelloServiceImpl implements HelloService{
	public String echoMessage(String msg){
		System.out.println("echoMessage in impl");
		return "";
	}
	public void printMsg(){
		System.out.println("printMsg in impl");
	}
}

class HelloServiceProxy  implements HelloService{
	HelloService helloService;
	public HelloServiceProxy(HelloService helloService){
		this.helloService = helloService;
	}
	public String echoMessage(String msg){
		System.out.println("befor call impl echoMessage");
		return helloService.echoMessage(msg);
	}
	public void printMsg(){
		System.out.println("befor call impl printMsg");
		helloService.printMsg();
		System.out.println("after call impl printMsg");
	}
}

class HelloServiceDyProxy {
	public static HelloService getHelloServiceProxy(
			final HelloService helloService) {
		InvocationHandler handler = new InvocationHandler() {
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Exception {
				System.out.println("before calling " + method);
				Object result = method.invoke(helloService, args);
				System.out.println("after calling " + method);
				return result;
			}
		};
		HelloService hello = (HelloService) Proxy.newProxyInstance(
				HelloService.class.getClassLoader(),
				new Class[] { HelloService.class }, handler);
		return hello;
	}
}

 运行结果

befor call impl echoMessage
echoMessage in impl
befor call impl printMsg
printMsg in impl
after call impl printMsg
--------------------------------------------------
before calling public abstract java.lang.String com.lwf.exception.HelloService.echoMessage(java.lang.String)
echoMessage in impl
after calling public abstract java.lang.String com.lwf.exception.HelloService.echoMessage(java.lang.String)
before calling public abstract void com.lwf.exception.HelloService.printMsg()
printMsg in impl
after calling public abstract void com.lwf.exception.HelloService.printMsg()

 

分享到:
评论

相关推荐

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    设计模式——代理模式

    此外,代理模式还可以利用动态代理技术,例如Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,这使得在运行时动态创建代理对象成为可能,而无需预先知道所有可能的代理类。...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    设计模式——刘伟

    6. **代理模式**:为其他对象提供一种代理以控制对该对象的访问。代理可以在目标对象前增加额外的功能,如缓存、日志记录、事务控制等。 7. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程...

    设计模式精解——GoF23中设计模式解析

    ### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    设计模式——原版的设计模式

    代理模式为其他对象提供一种代理以控制对这个对象的访问;组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。 3. **行为型模式**:这类模式涉及对象之间的责任分配。命令模式将请求封装为一个对象,从而...

    设计模式——GFour

    《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...

    PHP设计模式介绍——CHM

    - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - 责任链模式:避免将请求的发送者与接收者耦合在一起,多个对象可以处理同一个请求。 - 命令模式:将请求封装为一个对象,...

    基于Java的设计模式-代理模式demo的实现(高分课设)

    基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    动态代理设计模式-源码

    动态代理设计模式是一种在运行时创建对象代理的技术,它允许我们为现有的对象提供额外的功能,而无需修改原对象的代码。这种模式的核心是接口和代理类,通过接口,代理类可以与原对象进行通信,同时在代理类中添加...

    设计模式——装饰模式

    装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

Global site tag (gtag.js) - Google Analytics