设计模式复习提纲

1. 创建型(5)


  • (2,3)工厂模式 Factory:https://blog.csdn.net/qq_41157876/article/details/111554105
    • 简单工厂:if...else判断,违反开闭
    • 工厂方法:Product接口,Factory接口(实现类FactoryA,FactoryB...)
    • 抽象工厂:ProductA接口,ProductB接口,Factory接口 ——> 每个具体的工厂可以聚合多种产品


  • 5)原型模式 Prototype:https://blog.csdn.net/qq_41157876/article/details/112007433
    • 深拷贝 / 浅拷贝:相比new有更高性能
      • 浅拷贝:
        • 实现Cloneable接口,重写clone()方法
        • 只克隆对象本身和值类型,引用类型共用一个地址
      • 深拷贝:
        • 实现Serializable接口,用流实现
        • 全部都克隆

备注:

  • 工厂模式 vs 建造者模式
    • 前者创建简单对象,后者创建复杂对象

2. 结构型模式(7)

  • (6)适配器模式 Adapter:https://blog.csdn.net/qq_41157876/article/details/112003485
    • 三种类别
      • 类适配:Adapter(继承Adaptee类,实现Target接口)中,重写Target的方法(在里面调用并修改super的方法)
        • 继承结构使得代码灵活,但是由于单继承,Adaptee只能有一个
      • 对象适配:Adapter(聚合Adaptee类,实现Target接口)中,重写Target的方法(在里面调用并修改属性adaptee的方法)
        • 可以聚合多个adaptee,但是代码改起来麻烦
      • 缺省适配:Adapter(实现Target接口,所有方法空实现,供使用的时候复用重写)
        • 最为推荐(复用性,扩展性,解耦),但是最为难理解

  • (7)代理模式 Proxy:https://blog.csdn.net/qq_41157876/article/details/111604861
    • 静态代理:代码写死了
    • JDK动态代理:接口代理,实现invocationHandler接口(把要代理的接口作为属性传入),重写invoke()方法,调用静态方法Proxy.newProxyInstance()返回代理对象
    • cglib动态代理:子类代理,引入cglib的jar包,把代理对象的class文件加载进来,通过修改其字节码生成子类来处理

  • (8)装饰(器)模式 Decorator:https://blog.csdn.net/qq_41157876/article/details/111562542
    • 一个类可以分成主成分和装饰者,比如咖啡
      • 主成分——咖啡种类:意大利浓咖啡,无因咖啡,猫屎咖啡等等
      • 装饰者——调料:牛奶,豆浆,抹茶,巧克力粉等等




  • (12)享元模式 Flyweight:https://blog.csdn.net/justloveyou_/article/details/55045638
    • 单纯享元(所有单位都可以共享)和复合享元(复合类不能共享,单纯类可以共享)
    • 类似JAVA种的String池,有则直接从池中获取,没有则创建
    • 可以节约内存空间,提高系统的性能

备注:

  • 桥接模式 vs 装饰(器)模式
    • 接口和抽象的关系
      • 桥接模式:抽象类与接口是组合关系(松耦合),抽象类放入了接口作为属性
      • 装饰(器)模式:抽象类实现了接口(强耦合),(可选择并放入了接口作为属性)
    • 行为上
      • 桥接模式:两个独立的维度
      • 装饰(器)模式:组合关系(比如主成分,辅料)

3. 行为型模式(11)

  • (13)策略模式 Strategy:https://blog.csdn.net/qq_41157876/article/details/111831925
    • 策略接口Strategy 和 各个策略实现类(StrategyA,StrategyB...)
    • 对外提供封装策略的Context类,把Strategy作为属性传入,构造器 Context(Strategy strategy)
    • 调用时: Context context = new Context( StrategyA )



  • (16)迭代子模式 Iterator:


  • (18)命令模式 Command:https://blog.csdn.net/qq_41157876/article/details/111879835
    • 角色
      • Receiver(接收者):真正执行命令的对象
      • Command(抽象命令类),ConcreteCommand(具体命令类):拥有receiver属性
      • Invoker(调用者):拥有concreteCommand属性
      • Client(客户端):调用invoker的方法执行
    • 封装了Command对象,实现了invoker和receiver的松耦合

  • (19)备忘录模式 Memento:https://blog.csdn.net/qq_41157876/article/details/111880541
    • 角色
      • Memento:包含了要被恢复的对象的状态
      • Originator:创建新的Memento;或者设置Memento中的状态
      • CareTaker:记录Memento的历史状态
    • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态


  • (21)访问者模式 Visitor:


  • (23)解释器模式 Interpreter:

4. 设计模式六大原则

  • 单一职责原则
    • 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分
  • 里氏替换原则
    •  
  • 依赖倒转原则
    • 这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体
    • 写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互
  • 接口隔离原则
    • 每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分
    • 即,使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好
  • 迪米特法则
    •  
  • 合成复用原则
    • 合成/聚合 优于 继承

猜你喜欢

转载自blog.csdn.net/qq_41157876/article/details/111885174
今日推荐