摘要:
Spring AOP可以实现对指定的类的公共方法进行拦截,添加前置和后置处理,甚至对方法调用进行mock替换。内部实现原理是使用的JAVA的动态代理(针对具有接口的类)或者CGLIB(针对没有接口的类)。 下面以一个具体的代码例子来演示Spring AOP的使用。 1. 新建一个idea的maven 阅读全文
摘要:
一、缘起 算法与对象的耦合:对象可能经常需要使用多种不同的算法,但是如果变化频繁,会将类型变得脆弱。 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂。 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题? 阅读全文
摘要:
一、缘起 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合--比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不适合的。 在这种情况下,如何将“行为请求者”与“行为实现者”解耦? 将一组行为抽象为对象,可以实现两 阅读全文
摘要:
一、缘起 变化--是软件设计的永恒主题,如何管理变化带来的复杂性? 设计模式的艺术性和复杂度就在于如何分析,并发现系统中的变化点和稳定点,并使用特定的设计方法来应对这种变化。 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与 阅读全文
摘要:
一、动机 在软件系统中,由于需求的变化,一个对象的功能实现经常面临着扩展变化,但是功能接口方法比较稳定。如何使“对象功能实现的扩展变化”能够根据需要来动态地实现? 我们来看下怎样使用装饰器模式来应对功能的扩展变化。 二、需求变化过程 1、软件需求 考虑一个实际应用:实现灵活的奖金计算。 奖金计算的特 阅读全文
摘要:
一、动机 由于一个对象类型的固有逻辑,使得这个对象类型具有了两个(或多个)变化的维度。一个变化的维度为“。。。的变化”,一个变化的维度为“。。。的变化”。如何应对这种“多维度的变化”?如何利用面向对象技术来使得这个对象类型可以轻松地沿着“。。。”和“。。。”两个方向变化,而不引入额外的复杂度? 二、 阅读全文
摘要:
零、使用动机 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成。 由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持 阅读全文
摘要:
缘起 在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象的具体实现(类)经常面临着剧烈的变化,但是它却拥有比较稳定的接口。 如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求变化而变化? 我们可以使用工厂方 阅读全文
摘要:
Commons-Email建立在Java Mail API的基础上,提供了相对简化的发送邮件的API。 官方地址是:http://commons.apache.org/proper/commons-email/index.html 目前稳定版到1.5,快照版到1.6。 阅读全文
摘要:
我们在设计程序经常会有这种需求 , 某个类里的方法能够全局访问. 在这种情况下有两种实现方案 : 1>单例模式(Singleton); 2>静态方法. 但是, 对于这两种实现方式 , 那种更好呢? 在国内论坛上看了一下其他的一些看法 : http://hi.baidu.com/jiangzhong8 阅读全文