`
zhangfy068
  • 浏览: 148531 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

装饰者与动态代理

    博客分类:
  • java
 
阅读更多

 

package ch7;
/** 
 * @author
 * @version 创建时间:2013-1-7 下午11:55:43 
 * 类说明  装饰者与动态代理
 */

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

public class Jerry {
	public static void main(String[] args) throws Exception {
		//定义Jerry这只家喻户晓的老鼠
		Animal Jerry = new Rat();
		//为Jerry增加飞行能力
		Jerry = new DecorateAnimal(Jerry, FlyFeature.class);
		//Jerry增加挖掘能力
		Jerry = new DecorateAnimal(Jerry, DigFeature.class);
		//Jerry开始耍猫了
		Jerry.doStuff();
	}
}

// 定义动物
interface Animal {
	public void doStuff();
}

// 老鼠是一种动物
class Rat implements Animal {
	public void doStuff() {
		System.out.println("Jerry will play with Tom.");
	}
}

// 定义某种能力
interface Feature {
	// 加载特性
	public void load();
}

// 飞行能力
class FlyFeature implements Feature {
	public void load() {
		System.out.println("增加一只翅膀……");
	}
}

// 挖掘能力
class DigFeature implements Feature {
	public void load() {
		System.out.println("增加挖掘能力……");
	}
}

// 动物的包装类,可以包装所有的动物
class DecorateAnimal implements Animal {
	// 被包装的动物

private Animal animal;
	// 使用哪一个包装器
	private Class<? extends Feature> clz;

	public DecorateAnimal(Animal _animal, Class<? extends Feature> _clz) {
		animal = _animal;
		clz = _clz;
	}
	
	public void doStuff() {
		InvocationHandler handler = new InvocationHandler(){
			// 具体包装行为
			public Object invoke(Object p, Method m, Object[] args) throws Throwable {
				Object obj = null;
				//设置包装条件,例如根据ReturnType、Modifier等
				if(Modifier.isPublic(m.getModifiers())){
					obj = m.invoke(clz.newInstance(), args);
				}		
				animal.doStuff();
				return obj;
			}
		};
		// 当前加载器
		ClassLoader cl = getClass().getClassLoader();
		// 动态代理,由Handler决定如何包装
		Feature proxy = (Feature) Proxy.newProxyInstance(cl, clz
				.getInterfaces(), handler);
		proxy.load();
	}
}

 为某个类增加一些功能。。AOP的实现原理

 

分享到:
评论

相关推荐

    Java设计模式:静态代理、装饰者、动态代理详解

    总结来说,代理模式在Java中主要用于在调用实际对象时添加额外的功能,而静态代理、装饰者和动态代理则是三种不同的实现方式。静态代理简单直观,但需要手动编写代理类;装饰者模式更注重扩展对象功能;动态代理则...

    01.装饰者设计模式和动态代理设计模式.wmv

    01.装饰者设计模式和动态代理设计模式.wmv

    java动态代理 经典文章(word 2007格式的)

    动态代理可以用于实现如代理模式、装饰者模式等设计模式,为原对象添加额外功能,而无需修改原代码。 7. **具体示例**: - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式...

    [结构型模式] 装饰者模式的理解

    装饰者模式与代理模式有一定的相似性,但两者有明显的区别。装饰者关注于增强对象的行为,而代理则更侧重于控制访问,如权限控制、远程代理等。 为了更好地理解装饰者模式,可以参考提供的PDF文件。"装饰者模式-...

    装饰者模式.pptx

    ### 装饰者模式与继承、代理模式的区别 #### 与继承的比较 继承通常用于添加固定不变的功能,且在编译时期确定。而装饰者模式则提供了一种在运行时动态添加功能的方式,更加灵活。 #### 与代理模式的区别 代理模式...

    设计模式_结构型_装饰者模式.md

    #### 装饰者模式与代理模式的区别 装饰者模式和代理模式都是通过组合来扩展对象,但它们的侧重点不同。装饰者模式侧重于动态地为对象增加职责或行为,而代理模式侧重于控制对象的访问。代理通常用于访问控制,例如...

    JAVA反射机制与动态代理综合资料

    设计模式可能包括单例模式、工厂模式、装饰者模式等,这些模式在使用反射和动态代理时非常有用。 总的来说,这份“JAVA反射机制与动态代理综合资料”应该是一个全面的学习资源,涵盖了从基础概念到实际应用的多个...

    54-Spring设计模式之装饰器模式1

    * 代理模式:代理模式和装饰器模式类似,但是代理模式更关心的是控制原有对象的访问,而不是添加新的行为或功能。 * 适配器模式:适配器模式是用于解决不兼容的问题,而不是添加新的行为或功能。 * 模板方法模式:...

    day03 代理+适配器+桥接+外观+装饰

    代理模式、适配器模式、桥接模式、外观模式、装饰者模式 结构型模式是描述如何将类或对象按某种布局组成更大的结构的模式。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或...

    java装饰者模式代码

    装饰者模式是面向对象设计模式中的一种,它允许在运行时动态地给对象添加新的行为或职责,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它是一种结构型设计模式。 装饰者模式的核心思想是...

    装饰者模式

    5. 可能会讨论装饰者模式与其他设计模式(如适配器模式、代理模式)的区别。 6. 实际项目中的应用场景,比如日志记录、性能监控、权限控制等。 至于文件列表中的`mytest`,这可能是包含了一些示例代码或者测试用例...

    设计模式之代理模式视频教学

    2. 动态代理:在运行时创建代理类,Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。这种方式更加灵活,不需要预先知道所有的代理类,可以在运行时动态创建...

    装饰模式1

    它声明了所有装饰者和被装饰者共有的方法。 2. 具体构件角色(Concrete Component):实现了抽象构件角色,是被装饰的对象。它可以是一个简单的对象,也可以是一个已经具有某些行为的复杂对象。 3. 抽象装饰角色...

    7. 装饰器模式1

    例如,`java.io`包下的各种流类,如`BufferedInputStream`、`DataOutputStream`等,它们都作为基础流(如`FileInputStream`、`FileOutputStream`)的装饰者,通过组合的方式为基本的I/O操作增加了缓冲、格式转换等...

    Javascript设计模式之装饰者模式详解篇

    在JavaScript中,装饰者模式还可以与其他设计模式(如工厂模式、代理模式)结合使用,以实现更复杂的系统架构。同时,随着ES6及后续版本引入的类和类装饰器,装饰者模式的应用变得更加灵活和强大,允许在类定义时...

    轻松掌握java装饰者模式

    在实际开发中,装饰者模式广泛应用在各种框架中,例如Spring框架中的AOP(面向切面编程),通过代理对象来装饰原始对象,实现事务管理、日志记录等附加功能。此外,它还常见于GUI库,如Java Swing,通过装饰组件来...

    decorate-demo.zip

    装饰者模式与代理模式有些相似,但区别在于装饰者提供了比代理更多的功能扩展可能性。 在Java中,装饰者模式通常涉及到接口或抽象类,以及一系列实现了该接口或继承了该抽象类的装饰类。下面我们将深入探讨装饰者...

    C#装饰者模式实例分析

    装饰者模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为。这种模式常用于在运行时改变或扩展对象的功能,而不会破坏其封装性。在C#中,装饰者模式通常通过继承和组合来实现。 在...

    Ruby使用设计模式中的代理模式与装饰模式的代码实例

    首先,代理模式的核心思想是在主对象与客户端之间插入一个代理对象,代理对象作为主对象的代表,可以控制或扩展对主对象的访问。在提供的Ruby代码中,小明(xiao_ming)想要追求小红(xiao_hong),但不直接行动,...

Global site tag (gtag.js) - Google Analytics