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

读编写高质量代码整理(十)—使用反射增加装饰模式的普遍性

阅读更多

1。何为装饰者模式(Decorator Pattern)?

"动态地给一个对象天剑一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活"。

2。装饰模式类图

 

3。代码如下:

书本例子:我们以卡通片《猫和老鼠》(《Tom and Jerry》)为例,看看如何包装小Jerry让它更强大。

Component接口:

/**
 * Component
 * @author decorator
 */
public interface Animal {
	public void doStuff();
}

 ConcreteComponent类:

/**
 * ConcreteComponent
 * @author decorator
 */
public class Rat implements Animal {
	public void doStuff() {
		System.out.println("Jerry play ...");
	}
}

 Decorator接口:

/**
 * Decorator
 * @author decorator
 */
public interface Feature{
	public void load();
}

 ConcreteDecorator1:

/**
 * ConcreteDecorator
 * @author decorator
 */
public class FlyFeature implements Feature {
	public void load() {
		System.out.println("增加一双翅膀...");
	}

}

 ConcreteDecorator2:

/**
 * ConcreteDecorator
 * @author decorator
 */
public class DigFeature implements Feature{
	public void load() {
		System.out.println("增加钻地能力...");
	}
}

 DecorateComponent:

public class DecorateAnimal implements Animal {

	//被包装的动物
	private Animal animal;
	//使用拿一个包装器
	private Class<? extends Feature> clz;

	public DecorateAnimal(Animal _animal,Class<? extends Feature> _clz) {
		animal = _animal;
		clz = _clz;
	}
	@Override
	public void doStuff() {
		
		InvocationHandler handler = new InvocationHandler() {
			@Override //具体包装行为
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				Object obj = null;
				if(Modifier.isPublic(method.getModifiers())) {
					obj = method.invoke(clz.newInstance(), args);
					System.out.println(method.getName());
				
				}
				animal.doStuff();
				return obj;
			}
		};
		//当前加载类
		ClassLoader cl = this.getClass().getClassLoader();		
		//接口动态代理
		Feature proxy = (Feature) Proxy.newProxyInstance(cl,
				//clz.getInterfaces(),
				new Class[]{Feature.class},
				handler);
		
//		Class proxyClass = Proxy.getProxyClass(
//				Feature.class.getClassLoader(),
//				new Class[]{Feature.class});
//		Feature proxy = null ;
//		try {
//			 proxy=(Feature) proxyClass
//				 	.getConstructor(InvocationHandler.class)
//				 	.newInstance(new Object[]{handler});
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
		proxy.load();
	}
	
	public static void main(String[] args) {
		Animal jerry = new Rat();
		jerry = new DecorateAnimal(jerry, FlyFeature.class);
		jerry = new DecorateAnimal(jerry, DigFeature.class);
		jerry.doStuff();
	}
}

 

 

 

  • 大小: 15.9 KB
分享到:
评论

相关推荐

    信号完整性之初识信号反射_中为电子科技工作室

    在探讨信号完整性问题时...就像软件中的指针,即使不使用指针也能编写出功能完整的软件,但指针可以提供更高的资源利用率和代码效率。同样,理解并掌握信号反射的知识,可以帮助硬件工程师设计出更加稳定和高效的电路。

    阿里巴巴Java开发手册(详尽版1.4.0)

    1. **编码风格**:规范中详细规定了Java代码的命名规则,包括类名、方法名、变量名以及常量名的大小写和下划线使用方式,强调易读性和一致性。同时,对于注释也有明确要求,提倡使用Javadoc对类和方法进行文档化,...

    Java手机短信项目源码Java实用源码整理learns

    4. **Java最佳实践**:包括代码规范、设计模式、重构技巧等,帮助写出更高质量的代码。 5. **开源社区**:如GitHub,可以找到各种Java开源项目,参与贡献,学习他人的优秀实践。 6. **在线教程**:如Coursera、...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.80.docx

    常见设计模式包括工厂模式(用于创建对象)、单例模式(确保类只有一个实例)、观察者模式(实现对象间一对多依赖关系)、装饰器模式(动态地给对象添加功能)和策略模式(定义一系列算法,将它们封装起来,使它们...

    kotlin-reference-chinese

    习惯用法(idioms)是指在特定语言中普遍接受并广泛使用的编程模式。对于Kotlin而言,了解习惯用法可以帮助开发者写出更符合Kotlin风格的代码,提高代码质量。 #### 编码规范 遵循编码规范有助于保持代码的一致性和...

    侯捷-Java编程思想+第2版(繁体版)

    - **书籍定位**:本书被广泛认为是一本高质量、全面且深入的Java编程教程,不仅适合初学者,也适合有一定经验的开发者进一步提升编程技巧与理解。 - **读者反馈**:众多来自不同背景的读者给予本书极高的评价,认为...

    GPU-based Techniques for Global Illumination Effects

    GPU 基于的技术为全局光照提供了强大的支持,使得在实时环境中实现高质量的渲染成为可能。通过综合运用各种技术和算法,开发人员能够在游戏、电影制作和虚拟现实中创造出极其逼真的视觉效果。未来的研究将继续探索更...

    Java多态调用唯一性确定.pdf

    本文旨在解决Java多态调用唯一性确定问题,通过使用Soot开源工具和Java的反射机制,分析Java程序多态调用关系,确定函数调用路径,指导测试人员设计出高效、覆盖率高的测试用例。 Java多态性是面向对象语言中一个...

    基于NiosII与FPS200的半导体指纹采集系统设计.pdf

    其中,指纹识别因其独特的优势,如唯一性、稳定性、普遍性和易于采集,成为了广泛应用的身份认证手段。本文主要探讨了一种基于Nios II嵌入式处理器和FPS200半导体指纹传感器的采集系统设计。 Nios II是Altera公司...

    基于FPGA的UART接口设计.pdf

    - 信号完整性:信号传输过程中需要考虑信号的质量,避免信号反射、串扰、电磁干扰等问题,确保数据完整性。 - 资源优化:在保证设计性能的同时,需要对FPGA内部资源进行合理分配和优化,减少资源浪费,提高系统的性...

    2021年教师招聘考试题库《教育公共基础知识》考点特训带答案解析_33.docx

    25. 法律标准评价:训练法律标准的评价作用不仅具有普遍有效性,还具有明显的客观性。 26. 问题解决的关键阶段:提出假设是问题解决过程的关键,因为它决定了后续的推理和检验。 27. 关系转换说:该理论认为学习...

    Thinking in Java 4th Edition

    2. **高质量的练习题**:书中包含大量高质量的练习题,这些题目有助于加深对概念的理解,并提升解决问题的能力。 3. **实用性强**:无论是准备 Sun Certified Java Programmer 考试还是解决实际工作中的问题,本书都...

    STC89C52单片机的液位检测系统设计 电路图.doc

    这些问题可以通过增加调试语句、使用更高级的语言特性等方式解决。 - **硬件方面**:常见的硬件问题有电路板布局不合理、元器件损坏等。解决这类问题通常需要重新设计电路板或更换故障元器件。 - **总结**:调试...

    基于单片机的输液点滴系统设计--开题报告.docx

    随后,出现了基于激光多普勒原理、光纤全内反射原理等技术的输液报警装置,这些设备虽然提高了精度和稳定性,但仍存在安装不便、成本较高等问题。近年来,国内也有部分企业和研究机构开发出了具备一定智能化功能的...

    2021年教师招聘考试题库《心理学概述》考点带答案解析_1.docx

    25. **训练心理学讨论原则**:设计训练心理学研究应遵循**训练性原则**、**客观性原则**、**系统性原则**和**理论联系实际原则**。 26. **精神分析学派代表人物**:精神分析学派的知名代表人物是**弗洛伊德**。 27...

Global site tag (gtag.js) - Google Analytics