一句话总结23种设计模式

一 概述

断断续续写了一段时间的设计模式,终于把经典的23种设计模式全写完了。下面对这些设计模式总结一下。

二 设计原则

设计原则的介绍 : Java 设计模式之设计原则

即使我们之前没有专门看过这些原则,但是我们实际开发中或多或少都用到这些原则。实际上,这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性、可维护性。优秀的设计模式就是基于这些原则去实现的。

设计模式的精髓在于两个字:复用。

设计模式就是对设计经验的一种高级复用,而继承组合等就是对代码的复用;对于代码复用有几个原则:

  • 针对接口编程,接口就是指的抽象类的成员方法,这样的业务逻辑实现可以通过多态机制轻易动态改变功能
  • 尽量少使用继承,而多使用复合机制,继承机制会使得类变得十分庞大而难以维护,而组合可以在不产生新的子类的情况下实现丰富的功能,对于组合有7种结构设计模式

三 设计模式的分类

设计模式一般分为三类:创建型模式、结构型模式、行为型模式。

3.1 创建型模式

创建型模式简单来说就是用来创建对象的。一共有五种:单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式。

单例模式 :确保某一个类只有一个实例,并且提供一个全局访问点。

建造者模式 : 封装非常复杂的实例化过程,通常有一个导向器和构造器。

工厂方法模式 :将实例化时间延迟到子类,子类应用自动实例化不同的实例。

抽象工厂模式 :它主要强调实例化一系列的各种各样的产品,不同系列的产品构造由不同的子类产生,构造各种产品的接口作为一个父类。

原型模式 :当一个组合对象被实例化的时候,这个对象是个非常复杂而且功能是由运行时刻决定的,现在要把这个对象实例当做一个原型单位进行使用,每个对象都实现一个clone操作,这样就可以减少整个系统的类数目。

3.2 行为型模式

行为型模式主要是描述类或者对象是怎样交互和怎样分配职责的。

一共有十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

策略模式 :对于某个核心算法进行封装,这个算法会经常被修改,这就需要把算法的接口抽象出来,子类来实现具体的算法过程。

状态模式 :各种状态的操作都不同,这就会在一个方法中出现很多分支流程,这时候使用状态模式非常有用,也便于理解;将对象的不同状态分割成不同的状态对象。

责任链模式 :将消息的发送者和接受者解耦,发送者就往责任链上随便已发就完事,它不管哪个对象去实现这个消息,消息沿着链接传递直到被处理或者被丢弃;这个链可以通过继承关系或引用关系来实现。

观察者模式 :将数据和视图分开,通常一个 subject 被多个观察这观察,这些观察者会实现 update 操作,subject 都会实现 notify 操作。

模板方法模式 :就是父类定义了各个接口的调用顺序,而各个接口需要子类重新定义,这样就是同一套流程实现了不同的操作。

迭代器模式 :提供一种顺序方位各种对象的模式,通常需要使用template技术实现。

备忘录模式 :有些命令需要撤销,这就需要把对象的某些变化状态保存在一个备忘录对象中,当需要恢复时取出备忘录中保存的历史状态。

访问者模式 :对每个对象定义一个接口,原发器将自身作为参数传递给visitor子类,这样可以在不改变类系统结构的情况下自由添加新的功能,但是这种模式不适用于对象系统中对象经常变化的场合,每次对象变化可能都需要把所有的vsitor子类修改一遍。

中介者模式 :减少各个对象之间的交互,将交互的责任集中在一个中介对象中,有点类似与 Facade 模式。

解释器模式 :主要是针对某一种发明的语言或者协议,一般都会生成一个语法树,同时对分析结果使用buider模式实例化对象。

命令模式 :将消息封装在一个对象中,这消息对象指定接受者,这个消息对象可以通过责任链或者消息队列来存放。

3.3 结构型模式

结构型模式主要是用于处理类或者对象的组合。一共有七种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

代理模式 :将一些复杂的过程委托给一个独立的对象去处理,只需将this指针作为参数设置到代理对象,然后调用简单的接口即可实现很复杂的过程。

组合模式 :一个系统中各种对象存在树形结构或者有向无环图结构就应该使用这种模式,使得部分和整体的操作都一样。

适配器模式 :某个类已经投入使用中不可进行改变,另一个类与这个类比较类似,通过继承适配者类,引用被适配的类,然后通过之被适配者的功能来实现适配者父类的接口;如果需要双向适配就使用多继承的方法。

装饰者模式 :在一个系统的外层来修饰它的功能,让client没有感觉就完成功能的添加,从类图上看就是对原系统的一个包裹。

享元模式 :系统中有很多小对象,这些小对象会重复量非常大,浪费特别多的存储开销,这时候就需要使用Flyweight来共享对象,节约存储开销。

外观模式 :把一个复杂的子系统整合起来封装到一个类中,使得常用的接口统一在这个类中,这样可以让各个子系统关系更加清晰。

桥接模式 :发现一个系统中有两个独立变化的部分,业务逻辑和底层实现是不同的变化层次,这时候就需要把底层实现独立出来,用一个桥接类接口独立它们的变化。

四 其它设计模式

另外,除了这23种经典的设计模式,还涌现出其他的一些新的设计模式,比如:规格模式、对象池模式、雇工模式、黑板模式和空对象模式等等。后面有时间的话也会对这些模式进行分析。

五 最后

虽然设计模式是个好东西,能够给我们带来各种好处,比如降低对象之间的耦合,增加程序的可复用性、可扩展性、可维护性等等。

但是我们也不应该滥用设计模式,设计模式在一定程序上会增加系统的复杂性。我们在写码时应该评估好各方面,避免过度设计。

另外,设计模式的各种角色也不是固定不变的,根据实际需要,我们可以适当的进行改动。Android 的源码在这方面的改动就比较多。

由于上面那23种经典的设计模式提出来的时间也比较久了,一些设计模式,比如解释器模式,在我们的实际开发中基本上用不到,了解一下就可以了。同时,随着语言和技术的发展,有些模式可能已经过时。所以,我们要紧跟时代的发展。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值