设计模式概述

1. 设计模式是什么

我们在平时编写代码的过程中,会遇到各种各样的问题,细想一下很多问题的解决思路大致一样的,这时候你就可以把解决问题的思路整理清晰,成为一种解决问题的核心模式,以后你就能使用这种模式解决类似的问题,而不必绞尽脑汁寻找最优解决方案。经过多年各路大牛的贡献和实践,形成了一套系统的软件设计模式。

设计模式是软件工程的基石脉络,如同大厦的结构一样。之所以使用设计模式,根本原因是为了代码复用,增加可维护性。

2. 设计模式的类别

设计模式一共分为3种类型,共23种。

**1)创建型模式:**创建型模式抽象了实例化过程。他们帮助一个系统独立于如何创建、组合和表示他的对象。

属于创建型的设计模式:

单例模式(Singleton)抽象工厂模式(Abstract Factory)、工厂模式(Factory Method)、建造者模式(Builder)、原型模式(Prototype)。

**2)结构型模式:**结构型模式涉及到如何组合类和对象以使用的更大的结构,结构型模式采用继承或组合机制来组合接口或实现。

属于结构型的设计模式:

适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)

**3)行为型模式:**行为模式涉及到算法和对象间职责的分配。

属于行为型的设计模式:

模块方法模式(Template Method)、命令模式(Command)、迭代器模式(Iterator)、观察者模式(Observer)、中介者模式(Mediator)、备忘录模式(Memento)、解释器模式(Interpreter)、状态模式(State)、策略模式(Strategy)、职责链模式(Chain of Responsibility)、访问者模式(Visitor)。

学习任何一种设计模式都要从以下4点入手:

A.模式名称:一个助记名,他用一两个词来描述模式的问题、解决方案和效果。

B.问题:描述了应该在何时使用设计模式。

C.解决方案:描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。

D.效果:描述了模式的应用效果及使用模式应权衡的问题。

3. 设计模式的意图

每种设计模式都致力于解决一种问题,以下表格列举了这些设计模式的作用。

如此多的设计模式,初学者不必都要掌握,只需要掌握比较常用的几种:

创新型模式:单例模式、抽象工厂模式、工厂模式、建造者模式。

结构型模式:适配器模式、组合模式、代理模式。

行为型模式:观察者模式、中介者模式、职责链模式、命令模式。

以上就是23种设计模式的概述,学习之路任重而道远啊!

4. 设计原则

除了设计模式,也需要了解一下设计原则,这里给出一些设计原则的基本介绍。

单一职责原则:

模块或者函数的职责应该单一,修改这些代码的原因只有一个,避免有很多原因取修改一个函数。

开闭原则:

开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。

模块应对扩展开放,对修改关闭,模块应该在不修改源码的情况下进行扩展。

里氏代换原则:

如果调用的是父类的话,那么换成子类也完全可以运行。

Java编译程序会检查程序是否符合里氏代换原则。还记得java继承的一个原则吗?子类override方法的访问权限不能小于父类对应方法的访问权限。里氏代换原则是继承复用的一个基础。

依赖倒序原则:

所谓依赖倒序原则是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了实现与客户之间的耦合。传递参数,或在组合聚合关系中,尽量引用层次高的类

接口隔离原则:

客户端不应该依赖它不需要的接口;

一个类对另一个类的依赖应该建立在最小的接口上;

一个接口代表一个角色,不应该将不用的角色交给一个接口。没有关系的接口合并在一起形成一个臃肿的大接口,这是对角色和接口的污染;

不要强迫客户使用它们不用的方法,如果强迫客户使用它们不用的方法,那么这些客户就会面临这些不使用的方法的改变而带来的改变。

合成/聚合复用原则:

合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。

就是说要少用继承,多用组合关系来实现。否则修改父类的一个方法,各个子类都需要改动。“牵一发而动全身”!面向对象是要把波动限制在尽量小的范围。

最小知识原则(迪米特法则):

也叫迪米特法则。不要和陌生人说话,即一个对象应对其他对象有尽可能少的了解。迪米特法则的初衷是为了降低类之间的耦合,每个类尽量减少对其他类的依赖,这样系统的功能模块才更容易独立。

Last updated