- 创建类:工厂方法模式(Factory)、建造者模式(Builder)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、原型模式(Prototype)
- 结构类:适配器模式(Adapter)、桥梁模式(Bridge)、组合模式(Composite)、装饰模式(Decorator)、门面模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)
- 行为类:责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、模板方法模式(Template Method)、访问者模式(Visitor)
java
└── com
└── leeyom
└── design
├── behavior -- 行为类
│ ├── interpreter -- 解释器模式
│ ├── template -- 模板方法模式
│ ├── observer -- 观察者模式
│ │ ├── optimize -- 优化版
│ │ └── simple -- 简版
│ ├── memento -- 备忘录模式
│ │ ├── standard -- 标准版
│ │ └── clone -- 克隆方式
│ ├── chain -- 责任链模式
│ ├── state -- 状态模式
│ ├── iterator -- 迭代器模式
│ ├── visitor -- 访问者模式
│ │ ├── multivisitor -- 多访问者模式
│ │ └── standard -- 标准版
│ ├── command -- 命令模式
│ ├── mediator -- 中介者模式
│ └── strategy -- 策略模式
├── creation -- 创建类
│ ├── abstraction -- 抽象工厂模式
│ ├── prototype -- 原型模式
│ ├── singleton -- 单例模式
│ │ ├── extend -- 多例模式
│ │ ├── lazy -- 懒汉式
│ │ └── hungry -- 饿汉式
│ ├── builder -- 建造者模式
│ └── factory -- 工厂方法模式
│ ├── multiple -- 多工厂模式
│ ├── simple -- 建单工厂模式
│ └── standard -- 标准版
└── structure -- 结构类
├── proxy -- 代理模式
│ ├── dynamic -- 动态代理
│ ├── simple -- 普通代理
│ └── force -- 强制代理
├── decorator -- 装饰模式
├── bridge -- 桥梁模式
├── facade -- 门面模式
├── adapter -- 适配器模式
│ ├── extend -- 扩展版
│ └── standard -- 标准版
├── composite -- 组合模式
└── flyweight -- 享元模式
- 定义:应该有且仅有一个原因引起类的变更,即一个类应该只有一个职责。
- 单一职责原则有什么好处呢?
- 类的复杂性降低,实现什么职责都有清晰明确的定义;
- 可读性提高,复杂性降低,那当然可读性提高了;
- 可维护性提高,可读性提高,那当然更容易维护了;
- 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。
- 定义:只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
- 注意:如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。
- 定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。
- 注意:在Java中,只要定义变量就必然要有类型,一个变量可以有两种类型:表面类型和实际类型,表面类型是在定义的时候赋予的类型,实际类型是对象的类型,如zhangSan的表面类型是IDriver,实际类型是Driver。
- 定义:客户端不应该依赖它不需要的接口,类间的依赖关系应该建立在最小的接口上。
- 具体到接口隔离原则就是,要求在接口中尽量少公布public方法,接口是对外的承诺,承诺越少对系统的开发越有利,变更的风险也就越少,同时也有利于降低成本。
- 定义:只与直接的朋友通信。
- 一个对象应该对其他对象有最少的了解。
- 通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。
- 注意:迪米特法则要求类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限。
- 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
- 通过接口或抽象类可以约束一组可能变化的行为,并且能够实现对扩展开放,其包含三层含义:第一,通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法;第二,参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;第三,抽象层尽量保持稳定,一旦确定即不允许修改。