大话设计模式:设计模式六大原则
设计模式简介:
GOF(Gang of Four),指的是Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides四人出得一本书,在书中第一次提出设计模式得概念。
书中共有23中设计模式,分为3类创建型(5种)、结构型(7种)、行为型(11种)。
- 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
- 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
- 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
设计模式六大原则:
设计模式得根本目的是代码复用、增加可维护性,其中最重要的是开闭原则,开闭原则是终极目标,其余六种原则可以看作是开闭原则的实现方法。
开闭原则(OCP | Open Close Principle):
对扩展开放,对修改关闭。当我们程序在扩展时,在不修改现有代码的情况下新增功能,实现一个热插拨效果。
抽象化时开闭原则的关键,在Java中需要使用接口和抽象类。
具体做法是:定义抽象层,通过子类来实现具体的功能,当系统扩展时,抽象层不需要改变,只需要新增类来实现新功能,在不修改代码的基础上实现功能新增就达到开闭原则。
里氏替换原则(LSP | Liskov Substitution Principle):
程序中使用到基类的地方,完全可以用实现基类的子类替换,反过来使用基类替换子类不成立。
子类继承自父类,拥有父类定义的方法和变量,子类会添加自己的方法和变量,当用父类替换子类时可能造成子类新增的方法在父类找不到,导致程序报错。例如在IO包下的BufferedReader拥有readLine()这个方法,而他的父类Reader没有这个方法,用父类替换子类就会编译出错。
依赖倒置原则(DIP | Dependency Inversion Principle):
针对接口编程而不是针对实现编程。
在参数传递或类间关联关系时,尽量用更高层次的抽象类,而不是具体类。例如List和ArrayList,在参数传递时,用List比ArrayList好。
为了实现这一原则,子类应当只实现抽象类或者接口中的方法,不要多余的方法,这样父类可以调用子类中的方法。
小结:开闭原则是编码中的规范,里氏替换是编码中的框架,依赖倒置是具体代码。
接口隔离原则(ISP | Interface Segregation Principle):
每个接口应该只有一种角色,要使用多个隔离接口而不是使用单一的总接口,降低类的耦合度。
每个接口应该干一件事,不该干的事不干。
接口包含用户需要的一系列方法,用户不需要的不要放在同一个接口。
最小知道原则(DP | Demeter Principle):迪米特法则
一个人应尽量少的与其他实体之间相互作用,使系统模块更加独立。在一个模块修改时尽量小的影响别的模块。
尽量减少类之间的交互,如果两个对象之间不直接通信,那么两个类之间不应该相互通信,如果两个类之间必须相互交互,可借助第三方类。
类应该尽量降低成员变量和函数的访问权限,尽量设计不可变类,应尽量减少其他类的引用。
单一职责原则(SRP | Single Responsibility Principle):
一个类应该只负责一个功能模块,引起一个类类变化的因素只有一个。
一个类职责越多,复用的功能性越小,代码之间的相互调用就会越大,根据职责不用划分不同的类,不同的变化原因封装在不同的类中,当一个变化总会引起一系列变化时,应当分装在一个类里面。
单一职责原则是实现高内聚低耦合的指导方针,需要发现类的多重职责。