第一次写简书 以前都听人刷 今天开始自己刷简书 督促自己 加强学习
今天将的第一个学习内容:设计模式的概念意义以及基础的遵守原则
A、设计模式的概念意义
1. 软件设计模式的概念
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
2. 学习设计模式的意义
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。
可以提高程序员的思维能力、编程能力和设计能力。
使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
B、设计模式遵循的原则
1、开闭原则
什么是开闭原则,在我的理解当中,就是在原有的代码中不需要更改的情况下,自己进行调用测试。这样的情况下,既保持原有代码的使用性,又能测试出现有的问题。
作用:
a. 对软件测试的影响
软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
b. 可以提高代码的可复用性
粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
c. 可以提高软件的可维护性
遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
2、里氏替换原则
什么是里氏替换原则,在下的理解是:子类继承父类,其中具有父类中的方法、属性,然后自己也可以添加属于自己的个性化属性、方法。例如:鸟是所有鸟的统称,但是鸟里又有麻雀、鹦鹉什么的。这些格式各样的鸟的就是子类、而鸟就是父类。
里氏替换原则的主要作用如下。
里氏替换原则是实现开闭原则的重要方式之一。
它克服了继承中重写父类造成的可复用性变差的缺点。
它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
3、依赖倒置原则
什么是依赖倒置,原有的限制是子类中有可能有父类中的属性方法(保存有父类中的属性),现在为了消除这一个特性,将原有的父类设置成没有具体实现的接口或者抽象类,这样实现或者继承的子类就不会带有父类中的默认属性。
依赖倒置原则的主要作用如下。
依赖倒置原则可以降低类间的耦合性。
依赖倒置原则可以提高系统的稳定性。
依赖倒置原则可以减少并行开发引起的风险。
依赖倒置原则可以提高代码的可读性和可维护性。
4、单一职责原则
什么是单一职责原则,实际上就是让一个类,只负责一种类型的方法定义。打个比方说:一个人只会做属于自己工作的事情,不会说一个人干了水泥工、干了电工、干了钳工等,相比而言是不是一个人只干一份工作就较为简单和稳定。
5、接口隔离原则
什么是接口隔离原则,让一个约束(有可能是接口、有可能是抽象类),只负责属于自己该约束的事情,不让其掺杂其他的不需要自己负责约束的事情。比如java的数据结构中的List、Set、Map
接口隔离原则的优点
接口隔离原则是为了约束接口、降低类对接口的依赖性,遵循接口隔离原则有以下 5 个优点。
将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。
使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。
6、迪米特法则
什么是迪米特法则,说直白一点就是自己的东西尽量自己用,借给别人的只是别人需要的。
在运用迪米特法则时要注意以下 6 点。
在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
在类的结构设计上,尽量降低类成员的访问权限。
在类的设计上,优先考虑将一个类设置成不变类。
在对其他类的引用上,将引用其他对象的次数降到最低。
不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
谨慎使用序列化(Serializable)功能。
7、合成复用原则
什么是合成复用原则,直白点讲就是继承实现后,对其中的约束进行使用。例如:一个车有四个轮胎和车架、车座,法拉利也属于车,三蹦子是不是也是车,那么这些车应该都有车具备的属性(ps:怕有人给我举杠铃 自行车滑板车---------)。
通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。
继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。
它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
ps:在此标注 此文章是个人观后学习体会 有兴趣的可以一起学习