如果你想成为以为优秀的工程师,不管是从事 Android、前端、后台等方向,设计模式是必须要掌握的。
面向对象的好处
通过封装、继承、多态把程序的耦合度减低,用设计模式使得程序更加灵活,容易修改,并且易于复用。
设计模式六大原则
设计模式的六大原则:单一职责原则、开发封闭原则、里氏替换原则、依赖倒置原则、迪米特原则、接口隔离原则。
单一原则
单一原则:就一个类而言,应该仅有一个引起它变化的原因。通俗讲就是不要让一个类承担过多的职责。
开放封闭原则
开放封闭原则:类、模块、函数等应该是可以拓展的,但是不可修改。开放原则有两个含义:一个是对于拓展是开放,另一个是对于修改是封闭的。设计程序的时候,面对需求的改变要尽可能地保证相对稳定,尽量通过扩展的方式来实现变化,而不是通过修改原有的代码来实现。
里氏替换原则
里氏替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。在软件中将一个基类对象替换成其子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。里氏替换原则是实现开放封闭原则的重要方式之一。由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。使用里氏替换原则注意点:
- 子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏替换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义。如果一个方法只存在子类中,在父类中不提供响应的声明,则无法在以父类定义的对象中使用该方法。
- 在运用里氏替换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法。运行时,子类实例替换父类实例,可以很方便扩张系统的功能,同时无须修改原有子类的方法;增加新的功能可以通过增加一个新的子类来先实现。里氏替换原则是开发封闭原则的具体实现手段之一。
依赖倒置原则
依赖倒置原则:高层模块不应该依赖底层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节该依赖于抽象。
Java 中,抽象指接口或抽象类,两者都是不能直接被实例化;细节就是实现类,实现接口或者继承抽象类而产生的就是细节,也就是可以加上一个关键字 new 产生的对象。高层模块就是调用端,底层模块就是具体实现类。依赖倒置原则在 Java 中的表现就是,模块间的依赖通过抽象发生,实现类之间不发生直接依赖关系,其依赖关系是通过接口或者抽象类产生的。如果类与类直接依赖细节,那么就会直接耦合。
迪米特原则
迪米特原则:一个软件实体应尽可能少地与其他实体发生互相作用。
也被称为最少知识原则。如果一个系统符合迪米特原则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块。迪米特原则要求我们在设计系统时,应该尽量减少对象之间的交互。如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用。如果其中的一个对象需要调用另一个对象的某一个方法,则可以通过第三者转发这个调用。简而言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。将迪米特原则运用到系统设计中,要注意以下几点:
- 在类的划分上,应当尽量创建松耦合的类。类之间的耦合度越低,就越有利于复用。一个处在松耦合中的类一旦被修改,则不会对关联的类造成太大波及。
- 在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限。
- 在对其他类的引用上,一个对象对其他对象的引用应当降到最低。
接口隔离原则
接口隔离原则:一个类对另一类的依赖应该建立在最小的接口上。
奖励单一接口,不要创建庞大臃肿的接口;尽量细化接口,接口中的方法尽量少。也就是说,要为各个类建立专门的接口,不要视图建立一个很庞大的接口供所有依赖它的类调用。使用接口隔离原则对接口进行约束时,注意点:
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计的灵活性;但是如果过小,则会造成接口数量过多,使设计复杂化。所以,要适度。
- 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
- 提高内聚,减少对外交互,接口方法尽量少用 public 修饰。接口是对外的承诺,承诺越少对系统的开发越有利,变更风险也会越少。
设计模式分类
GOF 提出的设计模式总共有 23 种,根据目的准则分类,分为三大类。
- 创建型设计模式(5种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型设计模式(7种):适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型设计模式(11种):策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、中介者模式、解释器模式。
网友评论