- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
- 系统中某部分改变不会影响其它部份
- 针对接口编程,而不是针对实现编程
- 变量声明为抽象或接口,执行时动态赋值
- 多用组合,少用继承
- 为了交互对象之间的松耦合设计而努力
- 类应该对扩展开放,对修改关闭
- 根据业务和重要性,来取舍是否
- 依赖倒置原则
- 要依赖抽象,不要依赖具体类
- 变量不可以持有具体类的引用
- 工厂
- 不要让类派生自具体类
- 派生至接口或抽象类
- 不要覆盖基类中已实现的方法
- 避免破坏基类中被继承的抽象
- 变量不可以持有具体类的引用
- 要依赖抽象,不要依赖具体类
- 最少知识原则
- 减少对象之间的交互
- 好莱坞原则
- 别调用(打电话给)我们,我们会调用(打电话给)你
- 避免高、低层组件的相互依赖,导致依赖腐败
- 低层组件挂靠在高层组件,高层组件决定调用时机和方式
- 单一责任原则
- 一个类应该只有一个引起变化的原因
- 高内聚
- 一个模块或一个类,被设计仅支持一组相关功能时
- 定义
- 定义对象之间的一对多依赖;当一个对象状态改变时,所有依赖者都会收到通知并自动更新
- Java.Observervable
- Java.Observer
- 定义对象之间的一对多依赖;当一个对象状态改变时,所有依赖者都会收到通知并自动更新
- UML
- 示例
- 定义
- 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更为弹性的替代方案
- 装饰者可在所委托被装饰者的行为之前有或之后,加上自己的行为,以达到特定的目的
- 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更为弹性的替代方案
- UML
- 示例
- 定义
- 定义创建对象的接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
- 把类实例化推迟到子类
- 定义创建对象的接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
- 分类
- 简单工厂
- 根据 type 进行不同类型的创建
- 工厂模式
- 单一种类
- 抽象工厂
- 支持多种类型
- 简单工厂
- UML
- 示例
- 定义
- 确保一个类只有一个实例,并提供全局访问点
- UML
- 优化
- 多线程
synchronized getInstance()
- 性能效率降低非常
private static Singleton ins= new Singleton();
- JVM 加载时即人创建唯一实例
private volatile static VolatileSingleton ins;
- 双重检查加锁,最大限度减少同步
- volatile 可保障对应变量
- 多线程
- 场景
Java.Runtime.getRuntime()
- 饿汉式,static 形式初始化
Spring.AbstractFactoryBean.getObject()
- 定义
- 将请求封装为对象,以便使用不同的请求、队列或者日志来参数化其它对象
- 宏命令用于支持多个命令
- 实现行为请求者和行为执行者之间的解耦
- 将请求封装为对象,以便使用不同的请求、队列或者日志来参数化其它对象
- UML
- 场景
- 定义
- 在一个方法中定义一个算法的框架,将一些步骤延迟到子类中
- 子类在不改变算法结构的前提下,重新定义算法的部分步骤
- 通过预留钩子方法,保证算法的灵活性
- 在一个方法中定义一个算法的框架,将一些步骤延迟到子类中
- UML
- 示例
- java
- Arrays.sort
- InputStream.read(byte b[], int off, int len)
- 模式
- 工厂模式
- java
- 定义
- 为另一个对象提供一个替身或占位符以控件对这个对象的访问
- 适合远程、创建开销大、需要安全控制的对象
- 缓存代理、保护代理、虚拟代理
- 为另一个对象提供一个替身或占位符以控件对这个对象的访问
- 步骤
- 启动
rmiregistry
服务 - 编译并使用
rmic proxy.proxy.ProxyRemoteImpl
自动生成ProxyRemoteImpl_Stub
- 运行
ProxyRemoteImpl
服务 - 运行
ProxyRemoteClient
请求服务
- 启动
- 常见异常
- 未在启动远程服务前先启动
rmiregistry
服务 - 须确认变量和返回值类型可序列化
- 编译时不可见,只在运行时发现
- 未给客户端提供 stub 类
- 未在启动远程服务前先启动
- UML
- 场景
实现一个接口
,非特指利用implement
关键词实现接口,泛指实现某个超类型的某个方法
- 模式是在某情境下,针对某问题的某种解决方案
- 针对该问题约束的,可以解决此约束的通用设计
- 关键词:问题、情境、解决方案
- 推荐书籍
- 设计模式:可利用面向对象软件的基础
- The Timeless Way of building
- A Pattern Language
- 《HEAD_FIRST 设计模式》
- 图说设计模式
- design pattern 包教不包会