设计模式(十二):责任链模式(Chain of Responsibility)

生活或工作中经常会遇到一种情境,即要完成或处理某件任务时,需要经过层层传递到某一层级才能得到处理。

例如,加薪审批,直接的小组长可能并没有权限,需要向上报批,可能需要经过好几层到副总级别才得到处理。例如,击鼓传花游戏,花在多个人之间传递把大家连接起来,鼓声落,谁持有花谁就喝酒。

这种情境在软件设计中也是存在的,多个对象之间相互引用而形成一条链,最终链中的某一个对象处理了任务,而客户端并不需要知道具体是谁处理的,对象也不需要知道任务具体来自谁, 这就是责任链的最简单模型。

阅读更多

设计模式(十一):观察者模式(Observer Pattern)

观察者模式 又称为 发布 / 订阅(Publish / Subscribe)模式、源 / 监听模式(Source / Listener)。

观察者模式定义对象之间的一对多的依赖关系, 一个对象的行为发生改变,所有依赖于它的对象的行为也发生改变。观察者模式是对象的行为模式。

如果有了解 Servlet 监听器或消息中间件的 发布 / 订阅 模式的应该很好理解观察者模式。

阅读更多

设计模式(十):状态模式(State Pattern)

状态这个词较好理解,生活中很多事物都会有状态,有不同的状态,状态是可转变迁移的。例如 人有精神状态、身体会有疲劳状态或打鸡血状态。

在系统开发中,程序中有些对象可能会根据不同的状态做出不同的行为,把这种对象称为 有状态(stateful)的对象,把影响对象行为的一个或多个动态变化的属性称为 状态

阅读更多

设计模式(九):策略模式(Strategy Pattern)

软件开发过程中,当实现某一个功能可能需要支持多种算法或者策略(方案),例如电商促销,可以采用直接打折、满减计算、抵扣券、积分兑换 等方式,可以灵活地根据促销场景选择相应的促销方案(策略)。

每种策略都有自己的算法,选择具体的算法(策略)由客户端决定。策略模式可以将责任与算法分离,使得算法扩展更方便,易维护。

策略模式的实现方式在一定程序上可以解决和优化过多条件判断的操作,但这不是主要目的,只是附加效果。

阅读更多

设计模式(八):原型模式(Prototype Pattern)

系统中可能需要创建大量相同或相似对象,如果用构造方法创建则会比较耗时耗费资源,这时就可以使用 原型模式 ,生成对象更高效。

原型模式 就像复印机,可以复印多份相同的;像孙悟空的猴毛,拨下一吹就变出很多个孙悟空一样简单快捷。

阅读更多

设计模式(七):建造者模式(Builder Pattern)

软件系统中,通常会存在一些复杂的对象,由多个部件组成(拥有一系列成员属性,成员属性中有些是引用类型的对象),而部件的组装必须按照一定的顺序,否则不能组装成一个完成的复杂对象。

由于组合部件的过程很复杂,因此,这些部件的组合过程往往被 外部化 ,这里就可以引入 建造者模式,部件的组合过程由 建造者 负责,建造者 返回客户端一个建造完毕的完整对象,用户无须关系组装细节。

阅读更多

设计模式(五):创建型模式、结构型模式、行为型模式

设计模式(Design Pattern) 为面向对象设计中反复出现的问题提供解决方案。

设计模式是对使用 面向对象程序语言 进行 面向对象设计 而总结的方法论,代表了最佳实践,可以使得程序更具 扩展性、易于修改,易于复用。

设计模式(GOF 23 种) 根据使用目的分为三大类,分别是 创建型模式结构型模式行为型模式,每类又可细分为两个子类,分别对应对象

要理解 设计模式,前提是必须深入理解面向对象的三个基本特征:封装,继承、多态。有的把 抽象 也作为面向对象的基本特征,抽象严格来讲应归属于 继承。另外就是还需要对 高内聚、低耦合 略有体会。

此系列是个人对设计模式的理解 和 Java 实现 Demo 的汇总,同时也参考了大量网上的资料或博文,在此表示感谢。

强列推荐闫宏《Java 与 模式》,2002年出的书,大师出品,怎么看都不会过时,非常非常好,强烈推荐三次都不为过,看过该本书后我才对何为好书何为经典的书有了基本概念,特别是基础理论类的书,经典的书经久不衰。

遗憾的是该书没有新版印刷,但网上可以下载到电子版的。也看过其它设计模式相关的书,开发经验略丰富点的就会感觉到没落地,代码不典型,与实际脱节。

阅读更多

设计模式(四):代理模式之CGLIB动态代理(CGLIB Dynamic Proxy)

基于静态代理和动态代理需要绑定接口的局限性,而对类的代理在某些场景下确实是需要的,所以某些大牛就创造了CGLIB这个动态代理类库。

CGLIB底层是基本ASM字节码处理框架,该库允许在程运行时对字节码进行修改和动态生成新的类。

CGLIB所创建的动态代理对象的性能比JDK所创建的动态代理对象的性能高(大概10倍),但CGLIB在创建代理对象时所花费的时间却比JDK动态代理多(大概8倍)。

对于singleton的代理对象或者具有实例池的代理,因无须频繁创建对象,比较适用CGLIB动态代理技术;反之则适合采用JDK动态代理技术。

阅读更多

设计模式(三):代理模式之JDK动态代理(JDK Dynamic Proxy)

JDK 1.3 版本后,Java提供了动态代理技术,允许应用在运行期创建接口的代理对象。

JDK 提供的代理只能针对接口做代理。也有更强大的代理库 cglib,可以实现对类的代理。

JDK 的 java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,Proxy类利用InvocationHandler动态创建一个符合某一接口的代理,生成(运行时)目标类的代理对象。

在普通编程过程中,无须使用动态代理,但在编写框架或底层基础代码时,动态代理的作用就非常大。

阅读更多