赞
踩
设计模式是经过高度抽象化的在编程中可以被反复使用的代码设计的总结。如果系统使用了良好的设计模式,无论对满足当前需求还是适应未来的需求,对自身系统间模块的对接还是外部系统的对接,都有很大的帮助。
设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。最早的设计模式是GOF(四人帮)在《Design Patterns - Elements of Reusable Object-Oriented Software》(设计模式 - 可复用的面向对象软件元素) 的书中提到的,本书共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,这也被称为经典的设计模式。
设计模式按照其功能和使用场景可分为三大类:创建型模式、结构型模式和行为型模式
这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。
上图用一句话归纳了七种设计原则的概念,接下来结合案例对这些设计原则进行详细的讲解。
一个类只有一个职责,如果有多个职责(功能)被设计在一个类,这个类就违反了单一职责原则。
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。
一个对象承担了太多的职责,至少存在以下两个缺点:
1.一个职责的变化可能会削弱或抑制这个类 完成其他职责的能力。
2.需要对象的某一个职责时,不得不把其他职责包含进来,造成代码冗余和浪费。
单一职责原则的优点;
1.降低类的复杂度:一个类一个职责
2.提高类的可读性:复杂度低,可读性高
3.提高系统的可维护性:更容易维护
4.变更引起的风险降低:一个功能对其他功能影响小
单一职责原则的实现案例:
辅导员负责学生生活辅导,学业导师负责学生学业指导,一个对象只承担一个职责,分工明确。
开闭原则的经典定义:当对扩展开放,对修改关闭。是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。
开闭原则的优点:
1.扩展性强:无须修改现有代码。
2.可以提高代码的可复用性。
3.可以提高软件的可维护性:稳定性高和延续性强。
开闭原则的实现案例:
含义:里氏替换原则是对开闭原则的补充,任何父类可以出现的地方,子类都一定可以出现。
实现里氏替换的关键是抽象化
里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法
3.子类的方法重载父类的方法时,方法输入参数比父类要求宽松
4.重写父类方法时,返回值要求更严格或者相等。
里氏替换原则案例
正方形是一种特殊的长方形,长方形是父类,正方形是一种特殊的长方形,理所应当正方形是长方形的子类。长方形有单独改变长或宽的行为,对于正方形来说,就得改写这两个行为以保证长等于宽。这样就违背了里氏替换原则。
解决办法:加一个抽象类Quadrangle四边形,定义四边形的公共方法,正方形和长方形继承这些方法,并且可以添加自己特有的方法。
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
依赖倒置原则是实现开闭原则的重要途径之一。
核心思想是:要面向抽象(比如Java中的抽象类和接口)编程,不要面向实现编程。
依赖倒置原则的优点:
1.降低模块之间的耦合度。
2.提高系统的稳定性。
3.高代码的可读性和可维护性。
依赖倒置的实现案例:
定义“婺源网店”和“韶关网店”的共同接口 Shop,顾客类面向该接口编程,不需要修改代码顾客可以随意访问任意一家商店。
接口隔离原则:将不同的功能定义在不同的接口中,减少接口之间依赖的冗余性和复杂性。
含义:不要试图去建立一个很庞大的接口供所有依赖它的类去调用
接口隔离原则的优点:
1.将庞大的接口分解为多个粒度小的接口,提高系统的灵活性和可维护性。
2.高内聚,低耦合。
3.有多个专门的接口,不强迫新功能实现不需要的方法。
接口隔离原则实现案例
含义:尽量先使用组合或者聚合来实现,其次才考虑使用继承关系来实现。
注意:如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能。
继承的缺点:
1.父类的实现细节暴露给子类,破坏了封装性,又称白箱复用。
2.子类与父类的耦合度高,父类改变导致子类也改变,不利于维护
3.限制了复用的灵活性
合成复用原则的优点:
1.成员对象的内部细节新对象看不见,保证了封装性,这种复用又称黑箱复用。
2.新对象调用成分对象的方法是通过成员对象的接口,耦合度低。
3.复用的灵活性高。
合成/聚合复用原则案例:
一个电脑由CPU和内存和硬盘组成,将这些已有的组件纳入电脑对象中,电脑对象可以调用这些已有对象的功能,达到复用
迪米特原则的定义是:只与你的直接朋友交谈,不跟“陌生人”说话,一个对象应当对其他对象尽可能少的了解,降低耦合。
如果两个对象无须直接通信,不应该发生直接调用,可以通过第三方转发该调用, 使用代理的思想,不直接对其他类进行访问。
迪米特原则的优点:
1.降低类之间的耦合度,提高模块的相对独立性。
2.由于低耦合,提高了类的可复用率和系统的扩展性。
注意:过度使用迪米特法则会使系统产生大量的中介类,所以在使用该原则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
迪米特原则的实现案例:
明星与经纪人的关系实例,明星和粉丝以及媒体公司是陌生人关系,和经纪人是朋友关系,由经纪人代理负责处理粉丝见面会以及媒体发布会的事宜。
使用设计模式的意义是提高代码的重用性、可读性和可塑性,让读者更容易理解,系统更加可靠。设计模式并不是 Java 的专利,它同样适用于 C++、C#、JavaScript 等其它面向对象的编程语言。后续会介绍几种常用的设计模式,在实践中加深对设计模式的理解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。