抽象 abstract
舍弃个别非本质的特征。
过程抽象:一个功能分解为多个子功能,较高层次上思考问题
数据抽象:定义数据类型和限定的操作
对象 object
对象的数据称为属性,对象的操作称为服务或方法。
操作通过消息传递,可以为其它对象使用。
对外提供服务(public 公有的操作)。
属性 一般 只能通过执行对象的操作来改变。
类 class
对象客观事物分类:物理实体(飞机)、人或组织的角色(医生)、应该记忆的事件(飞行)、两个或多个对象的相互作用(购买)、需要说明的概念(政策)。
一组相似对象的定义,可以视为 模板,产生对象。
实例 Instance,属性 Attribute,方法 Method (通过该对象执行自己的方法改变,为其他对象服务)。
消息 Message (对象之间相互请求协作,执行其中某个操作的规格的说明),就是函数(或过程)调用,如 MyCircle.Show(GREEN)
。
OOP 三大特性
封装性 Encapsulation
对外隐藏,提供接口,无需知道细节。(通过 private protected 隐藏权限)。
继承性 Inheritance
子类自动地共享基类中定义的数据和方法的机制,不必重复定义。
能清晰体现类间的层次关系,提供可重用性,方便修改,方便建立和扩充新类。
多态性 Polymorphism
同一函数或运算符定义有多个不同的版本。(重载 Overloading,函数重载,运算符重载)
或不同层次中的每个类各自按自己的需要实现这个行为。
进一步减少了信息冗余,提高可重用性、可扩展性。
面向设计原则 SOLID+
单一职责原则
类的职责要单一,不能将太多的职责放在一个类中。
例子:登陆类中将登录表单和数据库逻辑抽离。
开闭原则
其功能对扩展是开放的,但对修改是关闭的。
例子:根据抽象类设计新类,通过配置文件反射获得实例。
里氏代换原则
可以接受基类对象的地方必然可以接受一个子类对象。
例子:不用对设置每一个对象都写一个方法,只用父类做为声明参数,传入子类参数实现符合定义。
接口隔离原则
使用多个专门的接口来取代一个统一的接口。
例子:抽象接口类再细分,细分的类再实现。
依赖倒转原则
针对抽象层编程,而不要针对具体类编程。
依赖注入,构造注入(constructor),设值注入(setter),接口注入(Interface)(注入依赖度逐渐减少)。
例子:就是对具体类构造抽象类。
合成复用原则
尽量多使用组合和聚合(聚合类不能单独存在)关联关系,尽量少使用甚至不使用继承关系。
继承复用是静态的,不可能在运行时发生改变,灵活性低。(实际上主要看具体使用环境,要复用代码的时候还要继承)
例子:当继承使用不恰当,想要使用被继承类的方法可以有多个实现,改为组合或聚合对象注入。
迪米特法则
软件实体对其他实体的引用越少越好,或两个类不必彼此直接通信。
不会和远距离对象有直接的关联,模块间大的通讯效率降低,但对信息隐藏的控制可以促进系统模块不过于依赖其他模块存在,每个模块可以独立使用。(系统规模大的时候适合改造)
例子:通过增加 Controller 操作控制流,代码层面上 Form、Dao 在各自类上不用知道对方,减少依赖度。
建模、分析、设计和实现
**模型 ** 由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。
统一建模语言 UML:为建立系统模型提供了一个图形化的表示手段。
用例图
时序图
异步消息可以不用返回或稍后返回,还有自关联关系(回环)。
活动图
类图
泛化:类与类之间的继承关系,接口与接口之间的继承,类对接口的实现关系。
继承,空心箭头+实线,箭头指向父类;接口,空心箭头+虚线
关联:类与类之间的连接,一个类知道另一个类的属性和方法。
实线+箭头,可以标识数量可以有0个或更多个对象,一对一,一对多关系。
聚合: 关联关系的一种,是整体和个体的关系,处于不同的 层次,一个是整体,一个是部分。
空心菱形+实线+箭头
合成:比聚合关系强的关联关系,部分不能单独存在,存在于整体的生命周期中。
实心菱形+实线+箭头
依赖:一个类依赖于另一个类的定义,体现为局部变量,方法的参数、或静态方法的调用。
对象图
设计模式
创建型模式:主要用于创建对象,实例化过程进行了抽象,对象的创建和对象的使用分离,职责更清晰。
结构型模式:处理类或对象的组合,类结构型模式关心类的组合(继承和实现关系),对象结构性模式关心类和对象的组合(通过关联关系调用方法,来替代继承关系)
行为型模式:描述对象怎么交互和分配职责,关注它们之间的相互作用。
类模式:关系通过继承建立,编译 时确定(包括配置过程确定),通过继承。
对象模式:关系通过关联建立,运行 时变化(运行时经常交互改变),更具动态性。
范围 \ 目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | (类)适配器模式 | 解释器模式、模板方法模式 |
对象模式 | 抽象工厂模式、建造者模式、原型模式、单例模式 | (对象)适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式 | 职责链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式 |
简单工厂模式 Simple Factory
产品来自同一个基类,一个工厂方法使用一个方法通过参数分支返回具体类。
工厂职责可能过重,适用于工厂类负责创建的对象类少,只需传参构建 不需知道创建细节 的情况。
简单工厂简化版,没有工厂类,产品基类 负责创建产品。
例子:支付功能,每个支付分支构建过程复杂,抽象构建过程为类。工厂返回支付类后可调用支付方法。
工厂方法模式 Factory Method
简单工厂模式:但有新产品加入到系统中时,必须修改工厂类,违反 “开闭原则”。
具体生产过程交给工厂子类来完成,那么就不用通过修改工厂类,工厂基类定义公共接口,通过增加具体工厂类来引进新的产品。
添加新的具体产品类时必须提供具体工厂类,编写开销增大,适用于创建对象的任务委托给某一个工厂子类的情况。
例子:具体工厂负责创建产品,过程过程可定制;日志功能类的生成。
抽象工厂模式 Abstract Factory
工厂方法模式:仅仅生产同一类产品。
需要工厂能够提供产品族(同一个工厂生产多个产品对象,位于不同产品等级结构(非同一产品基类))的情况下。
可以实现高内聚低耦合,但是添加新的产品等级结构时,需要对所有工厂角色进行扩展。
例子:电气工厂;数据库操作系统(生产 Connection 对象和 Statement 对象两个产品等级结构)
建造者模式 Builder
创建对象存在多个部件,部件生成过程和其组装过程分开,一步一步创建 一个复杂的对象。对于外部使用,同样只需传参。
Builder 创建者类 包括每个组件的生成过程,引入 Director 指挥者类 指挥 组装步骤。
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
// director.construct() 中调用 builder.buildA(), builder.buildB()...
Product product = director.construct();
可以更加 精细地控制 产品的创建过程,关键是针对抽象建造者类编程。
适合产品对象有 复杂的内部结构 的情况,内部对象生成需要 顺序 ,创建过程 独立 于创建该对象(使用指挥者)的情况。
例子:KFC 根据顾客要求套餐一步步组装套餐返回。
原型模式 Prototype
适用已存在一个对象,需要克隆出多个基于原型对象的对象的情况,减少频繁创建的过程。
原型类需要实现 clone
方法接口。
深克隆,对于每个引用对象重新创建。浅克隆,对于每个引用对象直接引用。
例子:相似对象复制改属性,比如游戏中同一类怪物的有不同属性,且需快速创建。
单例模式 Singleton
适用系统中仅允许存在一个实例的情况。
让类 自身负责 保存它的唯一实例:类自行创建,自行提供。
private static Singleton instance = null; // 也可以类加载时就实例化
private Singleton()
{
}
public static Singleton getInstance()
{
if(instance == null)
instance = new Singleton();
return instance;
}
单例类没有抽象,扩展麻烦,对象负担过重(例如连接池溢出),回收语言存在可能性销毁对象,导致状态丢失。
例子:数据库主键生成器。
适配器模式 Adapter
软件开发时可以通过目标类的接口访问它所提供的服务。
对于不兼容接口的对象,定义包装类 **适配器 Adapter **,所包装的对象是 适配者 Adaptee,可以使由于接口不兼容而不能交互的类可以一起工作。
public class Adapter extends Adaptee implements Target // 类结构模式
{
// Adaptee 也可作为对象成员(对象结构型模式)
public void request()
{
// 可添加兼容操作