GRASP原则
/** * 【GRASP】 * https://blog.csdn.net/u013249965/article/details/51779634 * * what? * (General Responsibility Assignment Software Patterns)通用职责分配软件模式; * * 要学习设计模式,有些基础知识是必须要知道的,设计模式是关于类和对象的一种高效、灵活的使用方式; * (必须先有类和对象,才能有设计模式的用武之地,类和对象从哪出来?需要比设计模式更重要更经典的GEASP模式) * * GRASP一共包含9种模式,如何决定一个系统有多少对象,每个对象都包括什么职责,GRASP模式给出了最基本的指导原则; * (尽快掌握、理解这些原则,因为这是如何设计一个面向对象系统的基础。可以说,GRASP是学习使用设计模式的基础) * * 1、信息专家Infomation Expert * 信息专家模式是面向设计的最基本原则,是我们平时使用最多,应该跟我们的思想融为一体的原则; * 也就是说,我们设计对象(类)的时候,如果某个类拥有完成某个职责所需要的所有信息,那么这个职责就应该分配给这个类来实现; * 这时,这个类就是相对于这个职责的信息专家; * * 2、创建者Creator * 实际应用中,符合下列任一条件的时候,都应该由类 A 来创建类 B,这时 A 是 B 的创建者: * a、A 是 B 的聚合 * b、A 是 B 的容器 * c、A 持有初始化 B 的信息(数据) * d、A 记录 B 的实例 * e、A 频繁使用 B * * 如果一个类创建了另外一个类,那么这两个类之间就有了耦合,也可以说产生了依赖关系。 * 依赖或耦合本身是没有错误的,但是他们带来的问题就是在以后的维护中产生连锁反应,而必要的耦合是逃不掉的,我们能做的就是正确的创建耦合关系,不要随便建立类之间的依赖关系,那么该如何去做呢? * 就是要遵守创建者模式规定的基本原则,凡是不符合以上条件的,都不能随便用 A 创建 B。 * * 3、低耦合Low coupling * 低耦合模式的意思就是要我们尽可能地减少类之间的连接。 * 其作用非常重要: * a、低耦合降低了因一个类的变化而影响其他类的范围。 * b、低耦合使用类更容易理解,因为类会变得简单,更内聚。 * * 下面这些情况会造成类 A、B 之间的耦合: * a、A 是 B 的属性 * b、A 调用 B 的实例的方法 * c、A 的方法中引用的 B,例如 B 是 A 方法的返回值或参数。 * d、A 是 B 的子类,或者 A 实现 B * * 4、高内聚High cohesion * 高内聚的意思是给类尽量分配内聚的职责,也可以说成是功能性内聚的职责。 * 即功能性紧密相关的职责应该放在一个类里,并共同完成有限的功能,那么就是高内聚合。 * 这样更有利于类的理解和重用,也便于类的维护。 * * 5、控制器Controller * 用来接受和处理 系统事件 的职责,一般应该分配给一个能够代表整个系统的类,这样的类通常被命名为“XX处理器”、“XX协调器”或“XX会话”。 * * 关于控制器类,有如下原则: * a、系统事件的接收与处理通常由一个高级类来代替。 * b、一个子系统会有很多控制类,分别处理不同的事务。 * * 6、多态Polymorphism * 这里的多态跟 OO 三大基本特征之一的“多态”是一个意思。 * * 7、纯虚构Pure Fabrication * 这里的纯虚构跟我们常说说的纯虚构函数意思相近。 * 高内聚低耦合,是系统设计的终极目标,但是内聚和耦合永远都是矛盾对立的。 * 高内聚以为这拆分出更多数量的类,但是对象之间需要协作来完成任务,这又造成了高耦合,反过来依然。 * 该如何解决这个矛盾呢?这个时候就需要纯虚构模式,由一个纯虚构的类来协调内聚和耦合,可以在一定程度上解决上述问题。 * * 8、间接Indirection * “间接”顾名思义,就是这个事不能直接来办,需要绕个弯才行。 * 绕个弯的好处就是,本来直接会连接在一起的对象彼此隔离开了,一个变动不会影响另一个。 * 就像我在前面的低耦合模式里说的一样,“两个不同模块的内部类之间不能直接连接”,但是我们可以通过中间类来间接连接两个不同的模块,这样对于这两个模块来说,他们之间仍然是没有耦合/依赖关系的; * * 9、受保护变化Protected Variations * 预先找出不稳定的变化点,使用统一的接口封装起来,如果未来发生变化的时候,可以通过接口扩展新的功能,而不需要去修改原来旧的实现。 * 也可以把这个模式理解为 OCP(开闭原则),就是说一个软件实体应当对拓展开放,对修改关闭。 * 在设计一个模块的时候,要保证这个模块可以在不需要被修改的前提下可以得到拓展。 * 这样做的好处就是通过拓展给系统提供了新的职责,以满足新的需求,同时又没有改变系统原来的功能。 * */