摘要: 定义 客户端不应该依赖它不需要的接口; 一个类对另一个类的依赖应该建立在最小的接口上。定义解读 定义包含三层含义:一个类对另一个类的依赖应该建立在最小的接口上;一个接口代表一个角色,不应该将不同的角色都交给一个接口,因为这样可能会形成一个臃肿的大接口;不应该强迫客户依赖它们从来不用的方法。 接口隔离原则有点像单一职责原则,但是也有区别,在单一职责原则中,一个接口可能有多个方法,提供给多种不同的调用者所调用,但是它们始终完成同一种功能,因此它们符合单一职责原则,却不符合接口隔离原则,因为这个接口存在着多种角色,因此可以拆分成更多的子接口,以供不同的调用者所调用。比如说,项目中我们通常有... 阅读全文
posted @ 2013-12-03 09:51 Gof Lee 阅读(1139) 评论(0) 推荐(0) 编辑
摘要: 定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖细节;细节应该依赖抽象。定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层模块(原子操作的模块),两者都应该依赖于抽象。我们平时常说的“针对接口编程,不要针对实现编程”就是依赖倒转原则的最好体现:接口(也可以是抽象类)就是一种抽象,只要不修改接口声明,大家可以放心大胆调用,至于接口的内部实现则无需关心,可以随便重构。这里,接口就是抽象,而接口的实现就是细节。 如果不管高层模块还是底层模块,它们都依赖于抽象,具体一点就是接口或者抽象类,只要接口是稳定的,那么任何一个的更改都... 阅读全文
posted @ 2013-12-03 09:26 Gof Lee 阅读(2531) 评论(0) 推荐(2) 编辑
摘要: 定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle)。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 广义的迪米特法则定义:一个模块设计得好坏的一个重要的标志就是该模块在多大的程度上将自己的内部数据与实现有关的细节隐藏起来。信息的隐藏非常重要的原因在于,它可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用阅读以及修改。定义解读 迪米特法则通常被表述为:Only talk to your immediate friend... 阅读全文
posted @ 2013-12-02 15:46 Gof Lee 阅读(1376) 评论(0) 推荐(0) 编辑
摘要: 定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名。定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都替换成o2时,程序的行为不发生任何变化,那么T2为T1的子类。定义2:所有引用父类的地方都必须能够透明地使用其子类对象。定义解读 其实两个定义所表达的意思都相同,就是在所有父类出现的地方,子类都可以出现,并且将父类对象替换为子类对象的时候,程序不会抛出任何异常或者错误,因此我们需要注意的是,尽量不要重载或者重写父类的方法(抽象方法除外),因为这样可能会改变父类原有的行为。优点代码共享,减少创建类... 阅读全文
posted @ 2013-12-01 17:52 Gof Lee 阅读(1873) 评论(0) 推荐(0) 编辑
摘要: 下面这张UML图(该图为网上找到的),比较形象地展示了各种类图关系: 对于继承、实现这两种关系没多少疑问,它们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。 返回目录 阅读全文
posted @ 2013-11-29 10:39 Gof Lee 阅读(515) 评论(0) 推荐(0) 编辑
摘要: 组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;它同样体现整体与部分间的关系,但此时整体与部分是不可分的,它们具有统一的生存期,整体的生命周期结束也就意味着部分的生命周期结束,部分对象与整体对象之间具有同生共死的关系,组合关系中的部分,是不能在整体之间进行共享的。比如人和眼睛,当然,有人会说现在医学发达,眼睛可以移植给别人,如果是这样的话,你可以理解人和眼睛的关系为聚合,这都是在具体的场景下来确定的。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。 在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周... 阅读全文
posted @ 2013-11-29 10:35 Gof Lee 阅读(1995) 评论(0) 推荐(0) 编辑
摘要: 聚合关系是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系,此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。 在聚合关系中,成员类是整体类的一部分,即成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。 UML示例图如下所示: 示例代码如下(概要,完整源码见附件): Computer.m文件 1 #import "Computer.h" 2. 阅读全文
posted @ 2013-11-29 10:29 Gof Lee 阅读(2417) 评论(0) 推荐(1) 编辑
摘要: 关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。它体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友。这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,关联可以是单向、双向的。表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。 在UML类图中,用实线连接有关联的对象所对应的类,在使用Java、C#和C++等编程语言实现关联关系时,通常将一个类的对象作为另一个类的属性。 1.双向关联。 ... 阅读全文
posted @ 2013-11-29 10:20 Gof Lee 阅读(2970) 评论(0) 推荐(0) 编辑
摘要: 依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类A在某个方法中使用类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。 UML示例图如下所示: 示例代码如下(People.m): 1 #import "People.h" 阅读全文
posted @ 2013-11-29 10:07 Gof Lee 阅读(1798) 评论(0) 推荐(0) 编辑
摘要: 实现关系是用来描述接口和实现接口的类或者构建结构之间的关系,接口是操作的集合,而这些操作就用于规定类或者构建结构的一种服务。 在接口和类之间的实现关系中,类实现了接口,类中的操作实现了接口中所声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。 UML示例图如下所示: 返回目录 阅读全文
posted @ 2013-11-29 09:57 Gof Lee 阅读(576) 评论(0) 推荐(0) 编辑