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(); } }
相关推荐
C语言编写高质量代码,想学习规范C语言的可以看看。
本书的核心内容是围绕Web前端开发的三大技术要素——HTML、CSS和JavaScript来深入地探讨编写高质量的HTML代码、CSS代码和JavaScript代码的方法、技巧、规范和最佳实践,从而为编写易于维护的Web前端代码打下坚实的...
编写高质量代码,适合有一定基础的编程者学习。
改善C#的157个建议编写高质量代码.zip
编写高质量代码:改善C#程序的150个建议完整版,提高代码整合开发能力
编写高质量代码-web前端开发修炼之道-源代码.pdf
编写高质量代码 改善Java程序的151个建议 PDF高清完整版
从基本语法、应用架构、工具框架、编码风格、编程思想等5大方面对web前端工程师遇到的疑难问题给出了经验性的解决方案,为web前端工程师如何编写更高质量的javascript代码提供了188条极为宝贵的建议。对于每一个问题...
《编写高质量代码:改善C++程序的150个建议》是李健编写的图书,该书是c++程序员进阶修炼的必读之作,包含的全部都是c++编码的最佳实践,从语法、编码规范和编程习惯、程序架构和设计思想等三大方面对c++程序和设计...
编写高质量代码 —Web 前端开发修炼之道
改善C#的157个建议编写高质量代码_源代码合集,这些实例均采用4.0框架,请运行使用Release模式;部分TIP由于简单未给出源码;这157个建议的源码涉及到语言篇、集合和LINQ、泛型、委托和事件、资源管理和序列化、异常...
html+js+css, 编写高质量代码-web前端开发修炼之道-源代码 本书的核心内容是围绕Web 前端开发的三大技术要素——HTML、CSS 和JavaScript 来深入地 探讨编写高质量的HTML 代码、CSS 代码和JavaScript 代码的方法、...
本书从C语言语法和C11标准2个方面深入探讨了编写高质量C代码的技巧与禁忌, 一共总结出125条宝贵的建议。每一个建议对应C程序员可能会遇到的一类问题, 不仅以建议的方式从正反两面给出了实践证明为十分优秀的解决方案...
微软四大名著之编程精粹:编写高质量C语言代码。亚马逊评出的微软四大名著之一,经典。
100个高质量代码编写建议rar,100个高质量代码编写建议
Oracle-怎样编写高质量的数据库代码
Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
第1章 javascript语言基础 / 1 第2章 字符串、正则表达式和数组 / 53 第3章 函数式编程 / 91 第4章 面向对象编程 / 133 ...第8章 javascript引擎与兼容性 / 300 第9章 javascript编程规范和应用 / 3
c#代码--编写高质量c#程序c#代码 --编写高质量c#程序