#1.设计模式是什么?
设计模式其实时基于在开发中经常出现的问题所提出的解决方案的核心,之后可以让你基于某中设计模式变出各种具体的招式,来应对各种问题。
然而设计模式除了要按照“面向对象的设计原则”加以分析之外,还要满足以下几个要求:
1.1解决一再出现的问题
软件开发就是使用某一种程序设计语言,来完成软件系统中需要具备的功能,这些功能就可以被设计者成为“问题”。常见的“问题”分为两种:一种是特定的问题,就是该问题只会出现在某一个软件系统中;另一种是泛问题,就是诸如此类的问题会以相同的形式出现在不同软件系统中。而设计模式就是针对这些泛问题所设计的解决方案。就可以让设计师在解决此类泛问题时可以直接使用这套解决方案,不必花费时间去重新思考和设计解决方案。
1.2“一般化”问题的关键点
每一种设计模式都是基于泛问题所提出的解决方案,而解决方案为应对各种泛问题就会将这些泛问题的核心和关键点一般化,最后设计出能够解决泛问题的类结构和组装方式。
1.3可重复使用
可重复使用的性质是设计模式最为核心的一点。因为设计模式已经经过了“一般化”处理,就可以让这套解决方案,在应对泛问题时可以被重复使用。
#2.设计原则
经过对设计模式性质的分析后,就该到了该篇最为核心的内容:“面向对象的设计原则”。在上一小节中提到“面向对象的设计原则”,那么什么是面向对象的设计原则呢?就是设计者在设计软件系统时需要遵循的设计原则,这些设计原则可以让实现出来的软件系统具有稳定性,易维护性和移植性。常见的设计原则有以下五个:
2.1单一职责原则
这个原则强调的是“在封装某个类时该类只负责一件事”。程序设计者往往在一开始时不会注意到这个原则,在项目的开发过程中会不断的向这个类中添加方法和接口,最后导致该类过于庞大,让该项目中其他类过度依赖此类,使得项目失去弹性并且后续的维护和业务拓展难以进行,从而发现这个问题。但是可以通过“类重构”的方式,将该类中实现相关功能的部分抽取出来,另外重新封装为一个新的类,再利用组合的方式将新构建的类加入到原来的类中,慢慢的就能符合类单一职责的原则。
2.2开——闭原则
“对拓展开放,对修改关闭”——就是当项目已经测试完成或已经上线时,就应该“关闭对修改的需求”也就是不能对该类进行任何的修改。但当需求增加时怎么办?这时就可以“对拓展开放”,为满足这个设计原则,在系统架构分析时就要朝着“功能接口化”的方向进行设计,将系统功能的“操作方法”向上提升,变为抽象方法,将“系统功能的实现”向下移到子类中。因此在面对需求的增加时就可以使用“增加子类”的方式来满足。具体的实现就是:重新实现一个子类,或继承旧的实现类,并在新的子类中增加想要实现的功能。这样就完成了“对拓展开放,对修改关闭”的设计原则。
2.3里氏替换原则
这个原则基本上是对“开——闭原则”提供了一个具体的实现法则,说明如何设计才能保持正确的需求开放。按照这个设计原则去实现一个类群那么父类通常是作为“抽象类”和“可被继承的类”并且类中有一些子类可以重新实现的方法。
2.4依赖倒置原则
此原则包含两个观念:1.高层模块不应该依赖与低层模块,两者都应该依赖与抽象概念。意思就是高层的模块不能被低层模块所限制。举个例子,乐高模块有长条形的,三角形的各种形状他们之间是用凹槽拼接,我现在想要在我已经拼好的房子上加个别的装饰,我的房子定义了一个抽象概念凹槽,只要任何一个物品他身上有凹槽就可以加入到我的房子这个高层模块。
2.抽象接口不应该依赖于实现,而实现应该依赖于抽象接口。就是说乐高的拼接不在依赖于与他拼接的是否是乐高售卖的组件,而是乐高售卖的组件依赖于那个凹槽接口。这样的两个观念就可以将高层模块依赖底层模块这种情况避免发生,从而大大增加了系统的活性。
2.5接口隔离原则
“客户端不应该被迫使用他们用不到的接口方法”,这个问题在随着开发的时间会越来越明显。例如在项目的初期往往会设计有一个“全能”的核心类来处理主要功能。但随着子系统的增加每当需要于子系统联系时都需要在这个核心类中增加相应的方法,但在调用时会出现许多子系统用不到的方法,增加了客户端的开发难度。但通过接口的拆分与简化可以减少这类问题的发生,将一个庞大的全能接口或类,拆分为不同领域的接口或类。
本篇基于SOLID面向对象开发原则并作为学习笔记发表,希望得到各位的批评与指正。