一、面向对象开发中的七大设计原则
软件开发中最核心的思想就是“高内聚,低耦合”,主要的目的也是为了方便后期的维护和变更。下面的设计原则也是依靠这个核心思想衍生出来的。
1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:单一职责原则想表达的核心思想就是“高内聚”,一个模块只完成一项功能。在面向对象设计中,一个类只应该负责一项职责,如果同时承担太多职责,就等于把这些职责耦合在了一起。
后面很可能因为某项职责的变更而导致其他职责的削弱或者抑制其他职责的能力。
2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:任何时候都可以用子类型来替换父类型。
3、依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】:面向接口编程,声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代,请参考下面的里氏替换原则。
4、接口隔离原则【INTERFACE SEGREGATION PRINCIPLE】:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口。
5、迪米特法则【LOW OF DEMETER】:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。(低耦合)
6、开闭原则【OPEN CLOSE PRINCIPLE】 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
7、组合/聚合复用原则【Composition/Aggregation Reuse Principle(CARP) 】:尽量使用组合和聚合,少使用继承的关系来达到复用的原则。类与类之间简单的说有三种关系,IS-A关系、HAS-A关系、USE-A关系,分别代表继承、关联和依赖。
其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是HAS-A关系,合成聚合复用原则想表达的是优先考虑HAS-A关系而不是IS-A关系复用代码
二、23种设计模式
设计模式是一套被反复使用的代码设计经验的总结,是对上面的设计原则的进一步细化,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。这23中设计模式概括起来可以分为三大类:
1、创建型模式(5种):
1.1、工厂方法模式(factory method pattern):如果需要创建大量对象,并且这些类都实现了共同的接口,那么可以用工厂方法模式来进行创建。
工厂方法模式存在缺陷,由于对象的创建依赖工厂的方法,如果需要创建新的类的实例,需要修改工厂类的方法,这样违反了开闭原则。
1.2、抽象工厂模式(Abstract factory pattern):由于工厂方法模式违反了开闭原则,那么我们就可以将工厂也进行抽象,如果要创建新的类型的对象,就创建新的对应的工厂类。这就是抽象工厂模式,该模式的缺点是创建的类比较多。
1.3、单例模式(Singleton pattern):单例对象能保证在一个JVM中,该类只有一个实例存在。
1.4、建造者模式(Builder pattern):建造者模式又名创建者模式,是将一个复杂对象的构建过程与它的表示分离,从而使得相同的构建过程可以创建不同的表示;
创建者模式隐藏了复杂对象的创建过程,它把复杂对象的构建加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
1.5、原型模式(prototype pattern):该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
2、结构型模式(7种):
2.1、适配器模式(Adapter pattern):将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
2.2、装饰器模式(Decorator pattern):动态的为一个对象增加新的功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
2.3、代理模式(Proxy pattern):代理模式就是多一个代理类出来,替原对象进行一些操作,实际操作的还是原来的对象。就像明星的经纪人一样,经纪人就是明星的代理。
2.4、外观模式(Facade pattern):也叫门面模式,为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。 就像去公司面试或者拜访只需要找前台就行,前台就算是公司的一个门面。
2.5、桥接模式(Bridge pattern):桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。
2.6、组合模式(composite pattern):组合模式将对象组织到树结构中,可以用来描述整体与部分的关系。组合模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。
组合模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。经典的例子就是部门树。
2.7、享元模式(Flyweight Pattern):主要通过实现对象的共享来减少创建对象的数量,以减少内存占用和提高性能。如共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。
3、行为型模式(11种):
3.1、策略模式(strategy pattern):策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式把行为和环境分开。
环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会 影响到环境和客户端。
3.2、模板方法模式(Template pattern):模板方法模式预备一个抽象类,在该抽象类的方法中只实现部分逻辑,然后声明一些抽象方法来迫使子类实现剩余的逻辑。
不同的子类可以以不同 的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类来实现。
3.3、观察者模式(observer pattern):让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
3.4、迭代器模式(iterator pattern):迭代器模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。
迭代器模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代器模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭 代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。
3.5、责任链模式(Chain of responsibility pattern):在 责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
客户并不知道链上的哪 一个对象终极处理这个请求,系统可以在不影响客户的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以终 极不被任何接收端对象所接受。
3.6、命令模式(Command pattern):命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
命令模式答应请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接 口,更不必知道请求是怎么被接收,以及操纵是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
3.7、备忘录模式(Memento pattern):保存一个对象的某个状态,以便在适当的时候恢复对象。
3.8、状态模式(State pattern): 状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便 改变所选的子类。
3.9、访问者模式(visitor pattern):访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操纵需要修改的话,接受这个操作的数据结构可以保持 不变。
访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增 加新的操作变的很轻易,就是增加一个新的访问者类。
访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时, 要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。
访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。
3.10、中介者模式(Mediator pattern):也叫调停者模式,用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
3.11、解释器模式(Interpreter pattern):定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
解释器 模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。
在解释器模式中需 要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。
命令对象的等级结构中的对象的 任何排列组合都是一个语言。