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(); } }
相关推荐
在探讨信号完整性问题时...就像软件中的指针,即使不使用指针也能编写出功能完整的软件,但指针可以提供更高的资源利用率和代码效率。同样,理解并掌握信号反射的知识,可以帮助硬件工程师设计出更加稳定和高效的电路。
1. **编码风格**:规范中详细规定了Java代码的命名规则,包括类名、方法名、变量名以及常量名的大小写和下划线使用方式,强调易读性和一致性。同时,对于注释也有明确要求,提倡使用Javadoc对类和方法进行文档化,...
4. **Java最佳实践**:包括代码规范、设计模式、重构技巧等,帮助写出更高质量的代码。 5. **开源社区**:如GitHub,可以找到各种Java开源项目,参与贡献,学习他人的优秀实践。 6. **在线教程**:如Coursera、...
常见设计模式包括工厂模式(用于创建对象)、单例模式(确保类只有一个实例)、观察者模式(实现对象间一对多依赖关系)、装饰器模式(动态地给对象添加功能)和策略模式(定义一系列算法,将它们封装起来,使它们...
习惯用法(idioms)是指在特定语言中普遍接受并广泛使用的编程模式。对于Kotlin而言,了解习惯用法可以帮助开发者写出更符合Kotlin风格的代码,提高代码质量。 #### 编码规范 遵循编码规范有助于保持代码的一致性和...
- **书籍定位**:本书被广泛认为是一本高质量、全面且深入的Java编程教程,不仅适合初学者,也适合有一定经验的开发者进一步提升编程技巧与理解。 - **读者反馈**:众多来自不同背景的读者给予本书极高的评价,认为...
GPU 基于的技术为全局光照提供了强大的支持,使得在实时环境中实现高质量的渲染成为可能。通过综合运用各种技术和算法,开发人员能够在游戏、电影制作和虚拟现实中创造出极其逼真的视觉效果。未来的研究将继续探索更...
本文旨在解决Java多态调用唯一性确定问题,通过使用Soot开源工具和Java的反射机制,分析Java程序多态调用关系,确定函数调用路径,指导测试人员设计出高效、覆盖率高的测试用例。 Java多态性是面向对象语言中一个...
其中,指纹识别因其独特的优势,如唯一性、稳定性、普遍性和易于采集,成为了广泛应用的身份认证手段。本文主要探讨了一种基于Nios II嵌入式处理器和FPS200半导体指纹传感器的采集系统设计。 Nios II是Altera公司...
- 信号完整性:信号传输过程中需要考虑信号的质量,避免信号反射、串扰、电磁干扰等问题,确保数据完整性。 - 资源优化:在保证设计性能的同时,需要对FPGA内部资源进行合理分配和优化,减少资源浪费,提高系统的性...
25. 法律标准评价:训练法律标准的评价作用不仅具有普遍有效性,还具有明显的客观性。 26. 问题解决的关键阶段:提出假设是问题解决过程的关键,因为它决定了后续的推理和检验。 27. 关系转换说:该理论认为学习...
2. **高质量的练习题**:书中包含大量高质量的练习题,这些题目有助于加深对概念的理解,并提升解决问题的能力。 3. **实用性强**:无论是准备 Sun Certified Java Programmer 考试还是解决实际工作中的问题,本书都...
这些问题可以通过增加调试语句、使用更高级的语言特性等方式解决。 - **硬件方面**:常见的硬件问题有电路板布局不合理、元器件损坏等。解决这类问题通常需要重新设计电路板或更换故障元器件。 - **总结**:调试...
随后,出现了基于激光多普勒原理、光纤全内反射原理等技术的输液报警装置,这些设备虽然提高了精度和稳定性,但仍存在安装不便、成本较高等问题。近年来,国内也有部分企业和研究机构开发出了具备一定智能化功能的...
25. **训练心理学讨论原则**:设计训练心理学研究应遵循**训练性原则**、**客观性原则**、**系统性原则**和**理论联系实际原则**。 26. **精神分析学派代表人物**:精神分析学派的知名代表人物是**弗洛伊德**。 27...