1、OCP(Open-Close Principle)开闭原则
Software entities should be open for extension,but closed for modification,(在设计一个模块的时候,应当使这个模块可以在不被修改的前提下扩展)。
对扩展开放open,对修改关闭close。
如何实现?1,抽象化是关键,2对可变性的封装原则(Principle of Encapsulation of Variation EVP)。3.对可能的拓展预留接口
备注:
1) 对于抽象化, 我的理解是, 接口是相对稳定的, 实现是根据需求多变的。对于大多数可能预料的变化点, 我们可以抽取出共性或者常态点, 进行接口的封装, 而选择不同的实现类嵌入模块, 从而达到可扩展的作用。
2) 对于某个业务点, 可能以后有多种介入处理的情况, 那么这时候可以将业务抽象成事件(event)接口和监听器(listener)接口, 不同的处理需求生成不同的listener, 接入模块的listener收集器, 从而得到业务点的介入机会。最后达到功能的扩展。
典型容易理解的例子,工厂模式。当需要新增加一个类的时候,直接继承product接口就可以了 , 由工厂类来组装产生需要的product, 而不用大范围修改原有代码。OCP~
2、Liskov Subsitution Principle(LSP)里氏代换原则
就是子类可以代替父类出现的任何地方,在抽象的时候,重要的要理解的一个地方两个类之间是什么关系,是“has-A”?还是“Is-a”的关系。在 “has-a”的关系中,两个类存在的是依赖的关系(在类A里面存在类B的的变量);在“Is-a”的关系中,可以提取这两个类的“共同代码”放在抽象类 C中,然后A,B继承与C,这也是一种重构。
3、Dependency Inversion Principle(DIP)依赖倒转原则
就是在我们编程的时候方法的参数类型,变量,对于其他具体类的依赖,我们尽量的使用抽象类。
就是说尽量依赖于抽象,而不是依赖于实现。
在书中两种表述:
(1)Abstraction should not depend on details.details should depend on abstraction。(抽象不应当依赖于细节,细节应当依赖于抽象)。
Abstraction就像是建筑物的基础,而其实现类就是在基础上面一层一层的往上面走。你拆掉最上面 那层,和拿走最下面的基础,有什么不同了,这就是差异了。所以Abstraction是要相当的稳定,是维护的重点。也正是因为稳定,所以我们尽量的依赖 于Abstraction,既是稳定系统,也是灵活系统。
(2)Program to an Interface,not an implementation(要针对接口编程,不要针对实现编程)
应当使用java接口和抽象java类进行变量的类型声明,参数的类型声明,方法返回值的类型和数据类型的转换。
备注:
依赖倒转原则的作用在于多模块或者类间有统一的”知识”, 都知道有这个接口, 都知道这个接口是这样用,会返回什么数据。
至于最初的实现类是什么, 只有提供该接口功能的实现类自己关心, 其他模块或者类只管用就行了。即使以后需求更改, 实现会换成别的一个, 其他模块和类也无需修改代码。
例如A模块提供了一个接口是: List getProducts()
而B和C会使用该模块, 他们只知道这个方法就会返回List , 他们知道List和Product代表什么.
但他们不会管你的接口内部是使用List list = new ArrayList() , 还是List lis = new LinkedList()
或者具体的Product是什么(可能是衣服,鞋子等)
4、Interface Segregation Principle(ISP)接口隔离原则
限制一个实体对另一个实体通信时候的宽度。
就是一个类对另外一个类依赖的时候,应当是建立在最小的接口上面。对于接口隔离原则来说,有两种接口,一种是真正意义上面的“java 接口”Interface;另外一种是指一个类的方法的集合。对于这来两种有,两个接口隔离的原则,对于一个类里面的方法的集合的接口隔离,我们称作是 “角色隔离原则”;另外一种叫做“定制服务”。
定制服务,就是一个类,我给你这个客户端一些方法,我放在一个java接口(Interface)里面。给另外一个客户端另外一些方法,放在另外一个接口(Interface)。
角色隔离原则,是指客户端要多个不同的类的方法,我们就搞几个不同类别的接口(Interface),在书中,这么比喻的,就相当于电影剧本里面的人物,我们找人来演,这个人就是具体的类。这就叫做角色隔离原则。
5、Composition/Aggregation Reuse Principle(CARP)组合/聚合复用原则
就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的。
其实这里最终要的地方就是区分“has-a”和“is-a”的区别。相对于合成和聚合,继承的缺点在于:父类的方法全部暴露给子类。父类如果发生变化,子类也得发生变化。聚合的复用的时候就对另外的类依赖的比较的少。
6、Least Knowledge Principle(LKP)最少知识原则,又称为“Law of Demeter”迪米特原则
和ISP接口隔离原则一样,限制类与类之间的通信。ISP限制的是宽度,而LoD迪米特原则限制的是通信的广度和深度。
LoD在广度上面,尽量减少远距离类的关联,而使用与自己有关的类,并且也与远距离类有关的类。
可是这种做法有一点麻烦。多个远距离类产生关联的时候,不怎么容易处理,所以增加一个远距离类的抽象类。所有的远距离类都是通过抽象类的形式来访问。
在深度上面,控制权限是最重要的,对于类,一个是default 和public,尽量最小权限;对于成员,private,default,protected,public。往上面走,权限越小,依赖的耦合就越小。
有几种描述:
(a)Only talk to your immediate friends.
(b)Don’t talk to strangers.
设计模式“facade”,”调停者模式”。在这里是IoD的典型表现。
备注:
当一个系统比较大的时候, 如果所有的模块都自己去寻找与自己相关的类的时候, 那么引用关系就会变得极度复杂, 耦合度高。
这个时候最好就设定一个为各个模块所熟悉的对象, 例如Context容器。
另外,各个模块可以应用facade模式, 提供一个简单的对外接口, 并将其嵌入Context容器。
这样, 模块间通过熟人Context来获取其他模块的Facade接口, 即符合依赖倒转原则, 接口隔离原则和迪米特原则。
相关推荐
以下是几个重要的设计原则: ##### 1. 单一职责原则(SRP) 单一职责原则指出,一个类应该只有一个引起它变化的原因。这意味着每个类都应该专注于完成一个特定的任务。 ##### 2. 开放封闭原则(OCP) 开放封闭原则...
在设计算法时,有几个基本原则需要遵循: 1. **明确问题定义**:首先,需要清楚地定义问题,包括输入、输出和约束条件。 2. **选择合适的数据结构**:不同的数据结构对算法的性能有重大影响,选择合适的数据结构...
这个PPT讲述了面向对象的几个基本原则,很详细,还有代码示例
代码编制是软件开发过程中的重要环节,其基本原则对于确保代码质量、提高开发效率以及后期维护具有决定性影响。以下是对这些原则的详细说明: 1. **惟一性**:每个对象在代码中应当有一个独一无二的标识,这有助于...
面向对象七大基本设计原则通常是指SOLID原则,它是一组面向对象设计的指导原则,旨在使软件更加可维护和可扩展。SOLID由以下五个原则组成: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该...
文章提出了使用面向对象编程(OOP)进行代码设计的几个原则: 1. **简化代码**:保持代码的简洁性,避免不必要的复杂度,确保代码易于理解和维护。文章提到,Pascal语言(Delphi的基础)倾向于优雅的程序结构,有助于...
以下是软件设计的几个关键原则: 1. 友好、简洁的界面设计:用户界面是软件与用户交互的桥梁,因此,设计时需考虑用户的使用习惯和舒适度。简洁明了的界面可以降低学习成本,提高用户满意度。良好的界面设计需要...
设计模式的几个基本原则包括: 1. **单一职责原则**:一个类应该只做一件事情,有一个明确的责任。 2. **开放封闭原则**:软件实体(类、模块、函数等)应对于扩展开放,对于修改关闭。 3. **里氏替换原则**:子类...
本文将围绕“C++代码设计与重用”这一主题,深入探讨其核心概念、基本原则以及实用技巧。 #### 二、C++代码设计的重要性 1. **提高开发效率**:良好的代码设计能够帮助开发者更快地实现功能模块,减少重复工作量。...
这包括但不限于以下几个方面: 1. **Java版本不兼容**:不同的Java项目可能依赖于不同版本的JDK(Java Development Kit)。如果当前系统的JDK版本与项目需求不符,则可能导致程序无法正常启动。 2. **环境变量设置...
对于LVDS的代码设计,理解差分信号的原理、熟悉硬件描述语言的编程规则,以及掌握数字逻辑设计的基本原则是至关重要的。通过不断地学习和实践,开发者可以掌握LVDS接口的设计,从而实现高效、稳定的高速数据传输。
本文将基于提供的部分信息深入探讨几个关键的GUI开发概念,特别是针对Java Swing开发。 #### 1. 绘图机制与刷新策略 Java中的图形界面通常依赖于AWT和Swing两个库来实现。其中,Swing是构建桌面应用的标准工具包之...
本文主要探讨了几个关键的数据库设计原则,包括各种范式标准、E-R图、三少原则以及提高数据库运行效率的方法。 首先,原始单据与实体之间的关系在数据库设计中起到基础作用。通常,原始单据可以一对一、一对多或多...
《Head First设计模式》(中文版)共有14章,每章都...千万不要轻视这些○○原则,因为每个设计模式背后都包含了几个○○原则的概念。很多时候,在设计时有两难的情况,这时候我们必须回归到○○原则,以方便判断取舍。
SOLID 是面向对象设计的五个基本原则的首字母缩写,由 Robert C. Martin 提出,旨在使软件设计更加灵活、可维护和扩展。ISP 的核心思想是,不应强迫客户端依赖于它们不用的方法,而是应该将相关的接口拆分成更小的...
迪米特原则(Least Knowledge Principle,LKP),也被称为最少知识原则,是软件设计中的一个重要概念,属于面向对象设计的基本原则之一。这个原则的核心思想是降低类与类之间的耦合度,使得系统更加灵活,可维护性和...
《设计模式与面向对象基本原则》是一份深入探讨软件开发中常用设计模式和面向对象编程核心概念的文档。这篇文档可能是为了方便阅读和打印而精心编排的“一页纸”版本,旨在提供一个简洁但全面的概述。通过博客链接...
文档《基本設計の基礎.doc》可能包括以下几个方面的重要知识点: 1. 文化理解:日本文化对设计的影响深远,包括对细节的关注、简洁性、用户体验(UX)的重视以及对质量的高标准。理解这些文化元素有助于创建更符合...
在提供的压缩包文件中,我们看到几个关键的目录和文件: 1. `.classpath`:这是一个Eclipse项目配置文件,它包含了项目的类路径信息,用于指导Eclipse编译器和运行时环境找到所需的类和库。这通常包括项目的源代码...