才知道原来是或者的关系,你知道么?
..因为设计模式就是要体现这些原则的,你可以把设计原则看做是一门语言,设计模式是由这些语言编码的程序..你既然已经明白,精通了语言,剩下的编码自然是很简单的事情,编码的越多则经验越多,经验越多则对原则的理解就越深...这是一个学习领悟的过程..
我希望这篇文章能帮助新人感受到设计模式的乐趣,避免重复编码....减少劳动量.. 如果你能在用心静静的体会文章的每个字,每段话的意思,这样可以避免走很多弯路...我以前学习设计模式的时候,就是因为忽略了原则,凭着感觉,看着书来 学习设计模式,结果就是知其然而不知其所以然....如果你是初学设计模式,再了解了OOP的三大原则(封套,继承,多态)之后,请反复的结合原则,来学 习设计模式..这样可以达到事半功倍的效果...
设计模式的核心原则是:"开-闭"原则( Open - Closed Principle 缩写:OCP ),一切的一切都是围绕着"开-闭"原则展开的..
意思是,在一个系统中,对于扩展是开放的,对于修改是关闭的,一个好的系统是在不修改源代码的情况下,可以扩展你的功能..而实现开闭原则的关键就是抽象化.
在"开-闭"原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在"开-闭"原则中扮演着极其重要的角色..即要预知可能变化的需求.又预见所有可能已知的扩展..所以在这里"抽象化"是关键!!!
可变性的封闭原则:找到系统的可变因素,将它封装起来..这是对 "开-闭"原则最好的实现..不要把你的可变因素放在多个类中,或者散落在程序的各个角落..你应该将可变的因素,封套起来..并且切忌不要把所用的可变因素封套在一起..最好的解决办法是,分块封套你的可变因素!!避免超大类,超长类,超长方法的出现!!给你的程序增加艺术气息,将程序艺术化是我们的目标!!
里氏代换原则:任何基类可以出现的地方,子类也可以出现..如果你通读过<Java编程思想>,我想你应该明白这个原则,在书中,Bruce Eckel 大师用了大量的章节来讲解"向上转型"和"向下转型",我想目的很清楚,不仅是要你明白类的型别,更重要的是要你明白父类与子类的关系..
依赖倒转原则:要依赖抽象,而不要依赖具体的实现..如果说开闭原则是目标,依赖倒转原则是到达"开闭"原则的手段..如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则..可以说依赖倒转原则是对" 抽象化"的最好规范!!我个人感觉,依赖倒转原则也是里氏代换原则的补充..你理解了里氏代换原则,再来理解依赖倒转原则应该是很容易的..
合成/聚合原则:要尽量使用合成/聚合原则,而不是继承关系达到软件复用的目的..此原则和里氏代换原则氏相辅相成的,两者都是具体实现"开-闭"原则的规范..违反这一原则:就无法实现"开-闭"原则..先来看看什么是合成,什么是聚合.
什么是合成?
合成:是指一个整体对依托他而存在的关系,例如:一个人对他的房子和家具,其中他的房子和家具是不能被共享的,因为那些东西都是他自己的..并且人没了, 这个也关系就没了..这个例子就好像,乌鸡百凤丸这个产品,它是有乌鸡和上等药材合成而来的一样..也比如网络游戏中的武器装备合成一样,多种东西合并为一种超强的东西一样..
什么是聚合?
聚合:聚合是比合成关系的一种更强的依赖关系,聚合是一个整体对个体的部分,例如,一个奔驰S360汽车,对奔驰S360引擎,奔驰S360轮胎的关 系..这些关系就是带有聚合性质的..因为奔驰S360引擎和奔驰S360轮胎他们只能被奔驰S360汽车所用,离开了奔驰S360汽车,它们就失去了存 在的意义..在我们的设计中,这样的关系不应该频繁出现..这样会增大设计的耦合度..
明白了合成和聚合关系,再来理解合成/聚合原则应该就清楚了..要避免在系统设计中出现,一个类的继承层次超过3次..如果这样的话,可以考虑重构你的代码,或者重新设计结构..当然最好的办法就是考虑使用合成/聚合原则...
迪米特法则:系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度, 因为在你的系统中,扩展的时候,你可能需要修改这些类,而类与类之间的关系,决定了修改的复杂度,相互作用越多,则修改难度就越大,反之,如果相互作用的 越小,则修改起来的难度就越小..例如A类依赖B类,则B类依赖C类,当你在修改A类的时候,你要考虑B类是否会受到影响,而B类的影响是否又会影响到C 类..如果此时C类再依赖D类的话,呵呵,我想这样的修改有的受了..
接口隔离法则:这个法则与迪米特法则是相通的,迪米特法则是目的,而接口隔离法则是对迪米特法则的规范..为了做到尽可能小的耦合性,我们需要使用接口来规范类,用接口来约束类.要达到迪米特法则的要求,最好就是实现接口隔离法则,实现接口隔离法则,你也就满足了迪米特法则...
合成、聚合复用原则
合成、聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部份,新的对象通过向这些对象的委派达到复用已有功能的目的。这个原则有一个简短的描述:要尽量使用合成、聚合,尽量不要使用继承。
合成、聚合有如下好处:
新对象存取成分对象的唯一方法是通过成分对象的接口。
这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不到的。
这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。
合成、聚合可以应用到任何环境中去,而继承只能应用到一些有限环境中去。
导致错误的使用合成、聚合与继承的一个常见原因是错误的把“Has-a”关系当作“Is-a”关系。如果两个类是“Has-a”关系那么应使用合成、聚合,如果是“Is-a”关系那么可使用继承。
迪米特法则
迪米特法则说的是一个对象应该对其它对象有尽可能少的了解。即只与你直接的朋友通信,不要跟陌生人说话。如果需要和陌生人通话,而你的朋友与陌生人是朋 友,那么可以将你对陌生人的调用由你的朋友转发,使得某人只知道朋友,不知道陌生人。换言之,某人会认为他所调用的是朋友的方法。
以下条件称为朋友的条件:
当前对象本身。以参量的形式传入到当前对象方法中的对象。当前对象的实例变量直接引用的对象。当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友。
当前对象所创建的对象。
任何一个对象,如果满足上面的条件之一,就是当前对象的朋友,否则就是陌生人。
迪米特法则的主要用意是控制信息的过载,在将其运用到系统设计中应注意以下几点:
在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。
在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。在类的设计上,只要有可能,一个类应当设计成不变类。在对其它对象的引用上,一个类对其它对象的引用应该降到最低。
如果你能看这里,说明你已经对这些原则了有了感性的认识..这些原则是设计模式的核心,如果不能充分理解这些原则,是很难理解好设计模式的..
如果第一遍看不懂,没关系,请反复揣摩,细读每个字,每句话..对于这些原则,我也是看了N*N遍才明白的(这期间也没任何人指点过我,更每人讲的这么细,奖励自己一下先, 汗啊)..我推荐看完原则之后,请看设计模式,看两三个模式,然后理解一下,自己动手把模式实现出来,再回头来看原则,你会感觉,你的模式一定是满足了其 中的某些原则!!这是必然的!!只要你理解了原则,设计模式不难理解..就好比,有了内功基础的你,再来学习刀,剑,枪这些武器的时候,要比那些直接学习 刀,枪,剑的人,快很多,效果也好很多...
相关推荐
在C#编程语言中,依赖倒转原则的应用尤其常见,因为C#提供了一些强大的特性来支持这一原则的实现。 1. **定义**: 依赖倒转原则指出,高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象。同时,抽象不...
依赖倒转原则(Dependency Inversion Principle,简称DIP)是软件设计中的一个重要原则,它属于SOLID设计原则之一。这个原则由Robert C. Martin在1994年提出,其核心思想是“高层模块不应该依赖于低层模块,两者都...
依赖倒转原则(Dependency Inversion Principle,简称DIP)是软件设计中的一个重要原则,它在面向对象编程领域具有深远的影响。这一原则的核心思想是“高层模块不应该依赖于低层模块,两者都应该依赖于抽象”。简单...
1. **高内聚,低耦合**:通过将依赖关系从具体的实现转移到抽象的接口,每个模块都只依赖于其必须的接口,而不是具体的实现类。这使得模块间的关系变得更为简洁,减少了模块间的相互影响。 2. **易于扩展**:当需要...
依赖倒置原则的包含如下的三层含义: ...3. 细节应该依赖抽象 就是面向接口编程,采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
3. 依赖倒转原则:依赖于抽象,不依赖于具体,使用接口或抽象类作为依赖。 4. 接口隔离原则:接口应该尽可能小且专注,减少类之间的耦合。 5. 迪米特法则(最少知道原则):一个对象应该只和它的直接朋友通信,减少...
8.3 依赖倒转原则...............................96 8.4 怎样做到依赖倒转原则...............99 8.5 Java 对抽象类型的支持...............101 8.6 一个例子:账号、账号的种类和账号 的状态...... 103 8.7 墨子论...
依赖倒转原则讲的是:要依赖于抽象,不要依赖于具体。这意味着,传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。倒转原则是要把这个错误的依赖关系倒转过来,这就是...
依赖倒转原则是软件开发中的一个基本原则,尤其在Java编程中具有重要的意义。该原则指出,高层模块(通常处理复杂的业务逻辑)不应当直接依赖于底层模块(通常是基础的、具体的实现),两者都应该依赖于它们的抽象。...
4. 依赖倒转原则:依赖于抽象而不是具体实现。编程时应面向接口,而不是具体类。这样可以降低耦合度,提高代码灵活性。 5. 接口隔离原则:接口应保持职责单一,避免一个接口承担过多的责任。这有助于减少不必要的...
依赖倒转原则(DIP):要依赖于抽象,不要依赖于具体。 接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好。 合成/聚合复用原则(CARP):要尽量使用合成/聚合,尽量不要使用继承。 迪米特法则(LoD):一...
这一原则强调的是软件实体(如类、模块、函数等)应当依赖于抽象,而不是具体的实现。具体来说,这意味着高层次的模块不应该直接依赖于低层次的模块,而是应该依赖于它们共同的抽象,即接口或抽象类。这样做的好处...
依赖倒转原则的主要目的是要实现开闭原则,避免高层模块对低层模块的依赖。 3. 单一职责原则(Single Responsibility Principle) 单一职责原则是指一个类应该只有一个原因引起变化。这意味着一个类应该只有一个...
依赖倒转原则 依赖倒转原则概述 依赖倒转原则(Dependency Inversion Principle, DIP)强调要依赖于抽象,而不是依赖于具体实现。这意味着高层次的模块不应该依赖于低层次的模块,两者都应该依赖于相同的抽象。 ...
3、依赖倒转原则【DEPENDENCE INVERSION PRINCIPLE】:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。 4、接口隔离原则...
合成复用原则指出:“要依赖于抽象,不要依赖于具体”。这意味着在设计系统时,应通过组合或聚合的方式复用对象,而不是通过继承来复用代码。 **具体方法:** - **针对接口编程:** 编写代码时,尽量使用接口而非...
4. 依赖倒转原则:要依赖于抽象,不要依赖于具体类。 5. 接口隔离原则:不应该强迫客户依赖于它们不用的方法。 6. 合成复用原则:尽量使用对象组合,而不是继承达到软件复用的目的。 7. 迪米特法则(最少知识原则)...
3. 依赖倒转原则:抽象不应该依赖细节,细节应该依赖抽象。 4. 里氏替换原则:子类可以扩展父类的行为,而不改变父类的接口。 四、设计模式 1. 简单工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个...
3. 依赖倒转原则:依赖于抽象,而不依赖于具体实现,降低模块间的耦合。 4. 里氏替换原则:子类必须能够替换掉它们的基类,不破坏程序的正确性。 5. 开闭原则:对扩展开放,对修改关闭,意味着添加新功能时,不应...