yqjdcyy / Book_Design_Pattern

Note about 《Head First Design Pattern》

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

设计模式

设计原则

  • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
    • 系统中某部分改变不会影响其它部份
  • 针对接口编程,而不是针对实现编程
    • 变量声明为抽象或接口,执行时动态赋值
  • 多用组合,少用继承
  • 为了交互对象之间的松耦合设计而努力
  • 类应该对扩展开放,对修改关闭
    • 根据业务和重要性,来取舍是否
  • 依赖倒置原则
    • 要依赖抽象,不要依赖具体类
      • 变量不可以持有具体类的引用
        • 工厂
      • 不要让类派生自具体类
        • 派生至接口或抽象类
      • 不要覆盖基类中已实现的方法
        • 避免破坏基类中被继承的抽象
  • 最少知识原则
    • 减少对象之间的交互
  • 好莱坞原则
    • 别调用(打电话给)我们,我们会调用(打电话给)你
    • 避免高、低层组件的相互依赖,导致依赖腐败
    • 低层组件挂靠在高层组件,高层组件决定调用时机和方式
  • 单一责任原则
    • 一个类应该只有一个引起变化的原因
    • 高内聚
      • 一个模块或一个类,被设计仅支持一组相关功能时

设计模式

策略模式

  • 定义
    • 定义算法族;分别封装后,让它们之间相互替换
    • 行为被封装进一组类中,并于需要时动态改变
  • UML
    • Strategy.jpg
  • 场景
    • Java
      • RejectedExecutionHandler
      • Java.Concurrent.RejectedStatery.png
    • Spring
      • Resource
      • Spring.Resource.png

观察者模式

  • 定义
    • 定义对象之间的一对多依赖;当一个对象状态改变时,所有依赖者都会收到通知并自动更新
      • Java.Observervable
      • Java.Observer
  • UML
    • Observer-basic.jpg
    • Observer-java.jpg
  • 示例
    • Spring 的事件机制
      • ApplicationEvent+ ApplicationListener+ ApplicationEventMultiCast
      • Spring.Event-Observer.png

装饰者模式

  • 定义
    • 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更为弹性的替代方案
      • 装饰者可在所委托被装饰者的行为之前有或之后,加上自己的行为,以达到特定的目的
  • UML
    • Decorator.jpg
    • Decorator-book.jpg
  • 示例
    • Java.IO
      • Readable+ Reader+ InputStreamReader
      • Java.IO.Readable.png
    • Spring 场景
      • ServletRequestWrapper+= ServletRequest
      • Spring.ServletRequest.png

工厂模式

  • 定义
    • 定义创建对象的接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
      • 把类实例化推迟到子类
  • 分类
    • 简单工厂
      • 根据 type 进行不同类型的创建
    • 工厂模式
      • 单一种类
    • 抽象工厂
      • 支持多种类型
  • UML
    • Factory-simple.jpg
    • Factory-abstract.jpg
    • Factory-abstract-implement.jpg
  • 示例
    • Java.SQL
      • Connection+ DriverManager/ DataSource
      • Java.SQL.Connection.png
    • Spring.AbstractFactoryBean
      • FactoryBean.getObject()+ AbstractFactoryBean.createInstance()+ ListFactoryBean|AbstractServiceLoaderBasedFactoryBean
      • Spring.FactoryBean.png

单例模式

  • 定义
    • 确保一个类只有一个实例,并提供全局访问点
  • UML
    • Singleton-basic.jpg
  • 优化
    • 多线程
      • synchronized getInstance()
        • 性能效率降低非常
      • private static Singleton ins= new Singleton();
        • JVM 加载时即人创建唯一实例
      • private volatile static VolatileSingleton ins;
        • 双重检查加锁,最大限度减少同步
        • volatile 可保障对应变量
  • 场景
    • Java.Runtime.getRuntime()
      • 饿汉式,static 形式初始化
    • Spring.AbstractFactoryBean.getObject()

命令模式

  • 定义
    • 请求封装为对象,以便使用不同的请求、队列或者日志来参数化其它对象
      • 宏命令用于支持多个命令
    • 实现行为请求者行为执行者之间的解耦
  • UML
    • Command.jpg
  • 场景
    • Java
      • Runnable
      • Java.Runnable.png
    • Spring
      • StatementCallback+ JdbcTemplate
      • Spring.JDBC.StatementCallback.png

适配器模式

  • 定义
    • 将一个类的接口,转换成客户期望的另一个接口
      • 让原本接口不兼容的类可以使用无间
      • 类型
        • 对象适配
        • 类适配,需要语言支持多重继承
  • UML
    • Adapter-object.jpg
    • Adapter-class.jpg

外观模式

  • 定义
    • 提供统一的接口,用于访问子系统中的一群接口
      • 定义高层接口,让子系统更容易使用
      • 提供简化接口的同时,依然将完整的功能暴露出来
      • 将业务从子系统中解耦出来,有调整需求时仅须调整外观代码
  • UML
    • Facade.jpg

模板方法模式

  • 定义
    • 在一个方法中定义一个算法的框架,将一些步骤延迟到子类中
      • 子类在不改变算法结构的前提下,重新定义算法的部分步骤
      • 通过预留钩子方法,保证算法的灵活性
  • UML
    • Template-basic.jpg
    • Template-hook.jpg
  • 示例
    • java
      • Arrays.sort
      • InputStream.read(byte b[], int off, int len)
    • 模式
      • 工厂模式

迭代器模式

  • 定义
    • 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示
  • UML
    • Iterator-basic.jpg
    • Iterator-java.jpg

组合模式

  • 定义
    • 允许将对象组合成树形结构来表现整体/ 部分的层次结构
    • 组合能让客户以一致的方式处理个别对象以及对象组合
  • UML
    • Composite-basic.jpg
    • Composite-iterator.jpg

状态模式

  • 定义
    • 允许对象在内部状态改变时改变它的行为
      • 对象看起来好像修改了它的类
      • 状态类可被多个 Context 实例共享
  • UML
    • State.jpg

代理模式

  • 定义
    • 为另一个对象提供一个替身或占位符以控件对这个对象的访问
      • 适合远程、创建开销大、需要安全控制的对象
      • 缓存代理、保护代理、虚拟代理
  • 步骤
    • 启动 rmiregistry 服务
    • 编译并使用 rmic proxy.proxy.ProxyRemoteImpl 自动生成 ProxyRemoteImpl_Stub
    • 运行 ProxyRemoteImpl 服务
    • 运行 ProxyRemoteClient 请求服务
  • 常见异常
    • 未在启动远程服务前先启动 rmiregistry 服务
    • 须确认变量和返回值类型可序列化
      • 编译时不可见,只在运行时发现
    • 未给客户端提供 stub 类
  • UML
    • Proxy-RMI.jpg
    • Proxy-protected.jpg
    • Proxy-dynamic.jpg
  • 场景

复合模式

  • 定义
    • 结合两个或以上的模式,组成一个解决方案
      • 解决一再发生的一般性问题
  • UML
    • Compound-all.jpg
    • Compound-mvc.jpg

桥接模式

  • 定义
    • 将抽象部分与实现部分分离,保障它们独立地变化
  • 实例
    • 跨平台视频播放器
      • 多平台:Windows、Linux、Unix 等
      • 多格式:MP4、AVI、RMVB 等
  • UML
    • Bridge.jpg

生成器模式

  • 定义
    • 封装产品的构造过程,并允许按步骤构造
  • UML
    • Builder.jpg

责任链模式

  • 定义
    • 让一个以上对象都有机会能处理某个请求
  • UML
    • Chain.jpg

绳量|享元模式

  • 定义
    • 为某个类提供多个虚拟实例
  • UML
    • FlyWeight.jpg

解释器模式

  • 定义
    • 义出其文法的一种表示,并同时提供一个解释器
  • UML
    • Interpreter.jpg

中介者模式

  • 定义
    • 集中相关对象之间复杂的沟通和控制方式
      • 通过将对象彼此解耦,增加对象的复用性
      • 将控制逻辑集中,简化系统维护
  • UML
    • Mediator-basic.jpg
    • Mediator-chatRoom.jpg

备忘录

  • 定义
    • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
    • 可以将该对象恢复到原先保存的状态
  • UML
    • Memento-basic.jpg
    • Memento-try.jpg

原型模式

  • 定义
    • 用于在保证性能的前提下,创建重复的对象
    • java.Cloneable
  • UML
    • Prototype.jpg

访问者模式

  • 定义
    • 封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作
  • UML
    • Visitor.jpg

注意事项

  • 实现一个接口,非特指利用implement关键词实现接口,泛指实现某个超类型的某个方法
  • 模式是在某情境下,针对某问题的某种解决方案
    • 针对该问题约束的,可以解决此约束的通用设计
    • 关键词:问题、情境、解决方案
  • 推荐书籍
    • 设计模式:可利用面向对象软件的基础
    • The Timeless Way of building
    • A Pattern Language

参考

书籍

扩展

资源

About

Note about 《Head First Design Pattern》


Languages

Language:Java 100.0%