(以下内容极其后面的关于设计模式的内容均来自《java高手真经(系统架构)》)
设计模式六大原则
原则 | 含义 | 具体方法 |
---|---|---|
开闭原则 | 对外扩展开放 ,对修改关闭 | 多使用抽象类和接口 |
里氏替换原则 | 基类可以被子类替换 | 使用抽象类继承,不使用具体类继承 |
合成复用原则 | 更依赖于抽象,不依赖于具体 | 针对接口编程,不针对实现编程 |
接口隔离原则 | 使用多个隔离的接口,比使用单个接口好 | 简历最小接口 |
迪米特法则 | 一个实体软件应该尽可能少的与其他实体发生相互作用 | 通过中间类建立联系 |
依赖倒转原则 | 尽量使用合成/聚合,而不是使用继承 | 尽量使用合成/聚合,而不是使用继承 |
开-闭原则(OCP)
对扩展快放:有新的需求或者变化时,可以对现有的代码进行扩展,以适应新的情况。
对修改关闭:类一旦设计完成,就可以独立完成自己的工作,而不要对类进行任何修改。
其他的原则基本都是对这一个原则服务的。
实现方式:抽象,多态,继承,接口
(离散的总结)
抽象是稳定的。
类依赖于抽象,抽象是不变化的,所以对类的修改是关闭的。
针对于抽象编程,而不是针对于具体编程。
只是针对于变化的程序进行抽象,在操作系统不适用于抽象
内容来源:http://video.tudou.com/v/XMTc5ODcyMzAwNA==.html
里氏替换原则
子类必须能够替换成他们的基类。
解释得详细一些就是:在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作,子类也能够在基类的基础上增加新的行为。
在进行设计的时候,我们应该尽量的从抽象类继承,而不是从具体类继承,如果从继承等级树来看,所有叶子节点应该当是抽象类或者接口。当然,具体情况具体分析。
依赖倒转原则
依赖也就是耦合,分为三种:
零耦合关系:两个类没有依赖关系。
具体耦合关系:两个具体类中间有依赖关系,如果一个具体类直接引用另一个具体类,就是这种关系。
抽象耦合关系:这种关系发生在一个具体类和恶一个抽象类之间,这样就使必须发生关系的类之间保持最大的灵活性。
倒转:程序中所有的依赖关系都是终止于抽象类或接口
依赖倒转原则要求客户端依赖于抽象耦合。
开闭原则的主要机制就是依赖倒转原则,里氏替换原则是依赖倒转原则的基础,依赖倒转原则是OOD夫人核心基础。
接口隔离原则:
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
迪米特法则
初衷:降低类之间的耦合,由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块独立,相互之间不存在(或者很少存在)依赖关系。
缺点:系统中存在大量的中介类,这些类的存在完全是为了传递类之间的相互调用的关系---在一定程度上增加了系统的复杂度。
合成复用原则
合成聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新的对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。
更简短的描述就是:要尽量使用合成聚合,尽量不要使用继承。
聚合表示整体和部分的关系,表示"拥有"。合成表示更强的"拥有"。在面向对象的设计中,有两种基本的办法实现复用:
第一种是通过合成/聚合,即合成复用原则,含义是,尽量使用合成/复用原则,而不是使用继承。
第二种是继承。
只有当以下的条件适合全部满足时才应当使用继承关系:
子类是超类的一个一个特殊的种类,而不是超类的一个角色。
永远不会出现将一个子类转换成另一个类的子类的情况,如果不能肯定将来是否会变成另外一个类的子类的话,就不要使用继承。
子类具有扩展超类的责任,而不是具有置换掉或者注销掉超类的责任。如果一个类需要置换掉超类的行为,那么这个类就不应该是这个超累的子类。
只有在分类学角度有意义时,才可以使用继承,而不要从工具类继承。