一个类;应该之负责一个职责。如果一个类有两个职责;将它拆解为两个类。
通常在编码上,要遵守单一职责。只要在逻辑简单下,才可以违反单一职责。
参考 0-base/03.singleResponsibly.cpp
两个类依赖应该是最小的。
面向接口编成;不而是具体类。
依赖的三种方式:
A 类 依赖 B类的基类。
1、A 类属性中有 B类;关联强。构造 A 类,必须现构造 B 类
2、A 类的某个方法使用了 B 类;依赖性不是强;可以不用使用那个方法;也能构造 A 类。
一个类被其它类继承后,修改这个类;可能会影响到所有之类。
1、子类;尽量不要重写父类的方法。
扩展开放、修改关闭。(针对使用方。)
将复杂的内部逻辑,封装在自己的类的类部。提供 public 方法供别人使用。降低类之间的耦合。
直接朋友: 成员、函数参数、函数返回值
非直接朋友: 局部变量。
### 依赖
只要在类中;使用到另外一个类;那么他们之间就存在依赖关系;如果没有对方;就不能构造自己.
1、类的成员属性
2、方法返回值
3、方法的接受参数
4、在方法中使用了局部变量。
### 泛化(继承)
是依赖关系的特列子,它继承了基类。
如果 A 类继承了 B 类;那么 A、B 有繁华关系
如果一个接口;被一个类实现了;那么它们就是实现关系。也是依赖关系的一种特列。
一对一
一对多
多对多
表示整体和部分的关系。整体可以和部分分开。
列、电脑可以将鼠标、显示器、键盘分开。(聚合关系) 电脑与鼠标、键盘、显示器为聚合关系。
列、电脑不可将cpu 分开(组合)
整体与部分不可分离;比如 人不能与心脏、肝 分开。
在项目中;只会有一个实例。,系统内存中只存放一个对象;节省了系统资源.
简单工厂模式,定义了一个创建对象类,由这个类封装实例的创建。
将创建对象;抽象成方法,在由具体的子类来实现创建。
用原型实例;指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。
他可以将复杂的建造过程抽象出来,使这个抽象过程的不同实现。 最主要是将产品与构造这个产品的流程分开。
将某个类的接口转换成客户端期望使用的结果,主要目的是为了兼容。 如、函数参数、函数返回值。
1、类适配器: 继承 2、对象适配器: 聚合 3、接口适配器: 实现一部分api、其余默认。
将实现与抽象放在两个不同的层次中,是两个层次可以独立。
主要是组合关系,两个抽象类。
动态的将新功能附加在对象上;在对象上扩展方面11。
Component: 这是组合中对象声明接口、实现所有类共有的默认行为、用于访问管理 Component 子组件。 Leaf: 叶子节点。 (Component) Composite: 包含叶子节点与 Composite 节点的 子节点(Component)
运用共享技术有效地的支持大细粒度的对象;能够处理重复对象浪费的问题。 如:c元的字符串
为一个对象提供一个替身体,以控制这个对象的访问。 静态代理: 需要定义接口或基类,被代理的对象,与代理对象一起实现相同的接口或基类。 JDK代理(动态代理): 代理对象不需要实现接口,但目标对象需要。否则不能动态代理。 Cglib代理(动态代理)
定一个操作算法的骨架,将一些步骤延迟到子类中, AbstractClass 抽象类;类中实现了模板方法;定义了算法骨架,具体子类需要实现。
处理数据结构与数据操作的分离。在被访问的类里面,添加一个对外提供接待者的接口。
1、Visitor 是一个抽象的访问者,为该对象结构中的 ConcreteElement 的每一个类声明一额 visit 操作。
2、ConcreteVisitor 是一个具体的访问者,实现每一个由 Visitor 的声明操作。
3、ObjectStructure 能枚举其它的元素,可以提供一个高层接口,用来允许访问者访问的元素.
4、Element 定一个 accept 方法,接受一个访问者
5、ConCreteElement 实现了 accept 方法。
不同的角色,访问一个类的属性,执行的操作不同。
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先的状态。 Origin: 原始对象。 Memento: 保存原始对象的一些需要备份的数据。 Caretaker: 管理Memento对象,在需要的时候,使用Memento对象恢复Origin对象的一些字段。
随着状态变化,改变对象的行为。
定义算法族,分别封装起来。
为请求的接受者,创建一个对象的链子。