今天起开始更新关于《设计模式》的文章,《设计模式》就是前辈们根据自己的代码设计经验,对软件开发过程中一些不断重复的问题,提出了相应的解决方案。提高了代码的可重用性、可读性和可靠性。经典的设计模式总共有23种,根据其目的性可以划分为创建型模式、结构型模式和行为型模式 3种。下表就是对其的具体划分:
| 分类 | 描述 | 具体模式 |
|---|---|---|
| 创建型 模式 |
用来说明怎 样创建对象 |
单例模式 原型模式 工厂方法模式 抽象工厂模式 建造者模式 |
| 结构型 模式 |
如何将类或 对象按某种 布局组成更 大的结构 |
代理模式 适配器模式 桥接模式 装饰模式 外观模式 享元模式 组合模式 |
| 行为型 模式 |
在不同的对 象之间划分 责任和算法 的抽象化 |
模板方法模式 策略模式 命令模式 职责链模式 状态模式 观察者模式 中介者模式 迭代器模式 访问者模式 备忘录模式 解释器模式 |
为了更好的理解《设计模式》,我们通过面向对象语言Java对这 23 种模式进行实现。
在学习设计模式的过程中感觉到设计模式的本质其实是对面向对象一些特性的灵活运用,比如:对类的封装性、继承性、多态性以及类之间的关系。我自己总结了几种思考思想,本质来说是对面向对象设计原则的一种理解和想法。
封装思想
类的封装是将数据和行为组合在一个对象中,并对对象的使用者隐藏了数据的实现方式。简单的理解就是在使用者和数据之间建立一个转节点。使对象使用者不能直接使用对象中的数据,而是通过定义的方法来操纵数据。就像抓娃娃机一样,想要获取里面的布娃娃,不能直接通过手去拿,而是通过操纵里面的夹子夹取布娃娃。这种思想在多个模式中都能够体现出来,一个对象A想要访问另一个对象B时,不是直接调用里面方法,而是他们之间添加一个对象C。对象A通过操作对象C来访问对象B。这样做的好处是当对象B发生改变时,并不需要改变对象A(不影响使用者),降低了耦合性;同时对象C在两个对象之间还能起到过滤作用,促进系统的安全性。
在面向对象设计原则中的迪米特法则和这种思想相似,迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
由于耦合度降低,从而提高了类的可复用率和系统的扩展性。
缺点就是当类的数量增多时,就会增加大量的中介类,从而增加系统的复杂度。
扩展复用思想
提高代码的可扩展性、可复用性是设计模式的主要任务。我了解了两种方式来对类进行扩展和复用,一种是继承;一种是合成或理解为组合。
合成方式:主要是对合成复用原则的体现,通过将已有的对象加入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。合成/聚合复用原则鼓励尽量使用合成/聚合,尽量不要使用类继承。
继承方式:当一个类需要扩展时,只需要在子类中实现扩展的部分,然后继承需要扩展的类就可以,此时子类有扩展部分也有父类中的一些部分,可以让子类替换父类。在面向对象设计原则中的里氏代换原则对继承方式进行了一定的约束,它要求继承必须确保超类所拥有的性质在子类中仍然成立也就是让使用者察觉不出父对象与子对象之间的区别,子对象与父对象的替换不影响使用者。
对软件扩展复用时,要尽量符合合成/聚合复用原则也就是优先使用合成/聚合,其次考虑使用类继承。因为合成的方式更好的保持了类的封装性,降低了两个类之间的耦合度,使复用更加灵活。当然,继承方式更简单,更容易实现。根据自己的需求灵活判断和选择。如果要使用继承方式,则应遵循里氏替换原则。
这两种扩展思想都能很好的满足开闭原则,开闭原则作为面向对象设计的核心所在,它要求软件实体应当对扩展开放,对修改关闭,这两种思想都是在类的基础上扩展的,并没有对原类进行修改。
多态思想
多态是对继承关系的另一种表述,在程序中出现超类对象的任何地方都可以用子类对象置换。这里的置换更多的是子类之间的替换。
依赖倒置原则是对多态的一个应用,它定义高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。它也是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。
除了上面介绍的几个设计原则,在面向对象设计原则中还有两个重要的设计原则单一职责原则和接口隔离原则。我感觉这两个原则是为了保证一个类不会过于庞大。
单一职责原则规定一个类应该有且仅有一个引起它变化的原因,不要让对象承担过多的职责。这样可以减少各个职责之间的相互影响,降低类的复杂度,降低变更引起的风险,提高系统可维护性。
接口隔离原则规定要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。也就是说不要让客户端实现它不需要的方法,对接口有一种约束作用。
单一职责原则和接口隔离原则其实都是让单个类的功能尽量减少,这样可以降低它们之间的耦合,提高系统的内聚性。
总结
本篇文章总结了自己在学习设计模式时的几种思想,也简单的了解了面向对象设计原则,在下面学习23种设计模式时,还会具体了解每种模式是如何对设计原则和思想的应用。