`
zhangfy068
  • 浏览: 145344 次
  • 性别: 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设计模式:静态代理、装饰者、动态代理详解

    静态代理、装饰者、动态代理1. 静态代理设计模式1.1 静态代理 – 实现步骤1.2 静态代理 – 逻辑图 & 源码示例1.3 静态代理 – 优缺2. 装饰者设计模式 – 类似静态代理2.1 装饰者模式 – 实现步骤2.2 装饰者模式 – ...

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

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

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

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

    服装代理加盟商城.rar

    ○9种界面风格、4种商品图片边框样式、3种验证码样式、9种横幅图片装饰效果,大小横幅均可开可关 ,可使用普通图片也可使用Flash动画,灵活多样的设置将组合出千变万化的效果。 ○首页的“新品速递”与“推荐商品...

    JavaScript设计模式之代理模式介绍

    说明:顾名思义就是用一个类来代替另一个类来执行方法功能,这个模式跟装饰模式有点相似,不一样的是,代理模式是代替客户初始化被代理对象类,而装饰模式采用接口或初装饰者参数引用的方式来执行的。 在动态面向...

    Head First Design Pattern(en) pdf(part3)

    3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的集合 10 ...

    ActionScript 3.0设计模式扫描版_方红琴译

    动态地选择具体的组件和装饰者:汽车销售网站 小结 第5章 适配器模式 什么是适配器模式? 对象适配器和类适配器 适配器模式中关键的OOP概念 实例:汽车驾驶适配器 实例扩展:使用鼠标驾驶汽车 实例:显示...

    Head First Design Pattern(en) pdf(part1)

    3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的集合 10 ...

    Java设计模式.docx

    工厂模式:工厂模式是一种创建型模式,它定义了一个用于创建...装饰者模式:装饰者模式是一种行为型模式,它允许在运行时动态地扩展对象的功能。 代理模式:代理模式是一种行为型模式,它允许控制对另一个对象的访问。

    Spring常见面试题

    动态代理需要jdk代理和cglib代理,jdk代理需要类加载器、接口、handler,cglib需要继承被代理类。 Spring框架 Spring框架是一个轻量级的Java开源框架,提供了一个通用的编程模型和配置机制。Spring框架模块有: *...

    java设计模式

    12.4.5 动态代理 12.5 最佳实践 第13章 原型模式 13.1 个性化电子账单 13.2 原型模式的定义 13.3 原型模式的应用 13.3.1 原型模式的优点 13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际...3 动态代理+Spring AOP 4 责任链模式进阶 Spring Framework设计模式 Spring 设计模式

    23种java版设计模式源码案例.zip

    动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式(structure) 适配器模式(adaptor) 桥接模式(bridge) 组合模式(composite) 装饰器模式(decorate) ...

    服装代理加盟商城

    ○9种界面风格、4种商品图片边框样式、3种验证码样式、9种横幅图片装饰效果,大小横幅均可开可关 ,可使用普通图片也可使用Flash动画,灵活多样的设置将组合出千变万化的效果。 ○首页的“新品速递”与“推荐商品”...

    [vip专享]java设计模式实验报告.pdf

    一、实验目的 使用 PowerDesigner 和任意一种面向对象编程语言实现几种常用的设计模式,加深对 这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器 模式、观察者模式、状态模式、策略...

    蚂蚁java架构师第七/八期含项目

    01.站在架构师角度分析Java动态代理模式(61分钟) 02.CGLIB底层实现的原理与异步注解失效之谜(61分钟) 03.SpringMVC源码角度分析@async失效之谜(141分钟) 04.使用装饰模式设计分布式多级缓存框架(82分钟) 05.使用观察...

    Java23种设计模式详解,看这一个就够了

    Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子...

    Delphi模式编程第一分卷

    12.3.1 装饰者模式在图片观赏器中的应用 12.3.2 范例小结 第13章 门面模式(Facade) 13.1 模式解说 13.2 结构和用法 13.2.1 模式结构 13.2.2 代码模板 13.2.3 问题讨论 13.3 范例与实践 13.3.1 门面模式和...

    Delphi模式编程第二分卷

    12.3.1 装饰者模式在图片观赏器中的应用 12.3.2 范例小结 第13章 门面模式(Facade) 13.1 模式解说 13.2 结构和用法 13.2.1 模式结构 13.2.2 代码模板 13.2.3 问题讨论 13.3 范例与实践 13.3.1 ...

Global site tag (gtag.js) - Google Analytics