【笔记】设计模式笔记

目录

一、基础知识

一、基础知识

1.耦合度就是相互依赖的程度,一个好的面向对象程序应该是通过封装、继承、多态使得耦合度降低的程序

2.UML图

  • 矩形框代表一个类
    • 第一层是类名称(斜体表示是抽象类)
    • 第二层是类的属性
    • 第三层是类的方法(+表示public,-表示private)
  • 接口有两种表示方法
    • 顶端有<>的矩形框
      • 第一层是接口名称
      • 第二层是接口方法
    • 棒棒糖表示法,用圆圈+实线表示(棒棒糖表示法)
      • 圆圈旁边是接口名称
  • 空心三角形+实线表示继承
  • 空心三角形+虚线表示用类实现接口
  • 实线箭头表示关联,关联的意思是一个类知道另一个类的信息
  • 空心菱形+实线箭头表示聚合,聚合是一种弱的‘拥有’关系,体现的是A可以包含B,但B不是A的一部分(例如A是雁群,B是大雁)
  • 实心菱形+实线箭头表示合成,合成是一种强的‘拥有’关系,体现了部分和整体的关系,部分和整体的生命周期一样(例如A是鸟,B是翅膀)
  • 虚线箭头表示依赖关系,例如A类需要(参数a,参数b),那么就是A依赖a和b

3.简单工厂模式思想

  • 结构包括客户端、工厂类、业务类
  • 客户端调用工厂类,工厂类根据实际情况实例化合适的业务类
  • 业务逻辑和界面逻辑分开来
  • 每个分支功能都是一个业务类,增加或修改某一功能不会影响或看到其他功能的代码
  • 工厂类会根据你的输入自动实例化合适的对象,关注创建的对象
  • 客户端不负责判断分支、创建对象,但要负责调用对象的方法
  • 但是类不是越多越好,类的划分时为了封装,应该将具有相同属性和功能的对象抽象集合起来成为一个类

4.策略模式思想

  • 结构包括客户端、context类、策略类、算法类,所有算法都是策略类的子类实现了策略类里的虚函数
  • 客户端实例化context类,context类里有一个策略类对象,根据客户端传入内容类的参数传给策略类,策略类根据情况选择具体算法
  • 策略类会根据你的输入自动选择合适的算法,关注采取的行为
  • 客户端负责判断分支并创建对象,只不过方法交由context类去实现了

5.单一职责原则

  • 就一个类而言,应该只有一种功能,即应该仅有一个引起它变化的原因(那就是这项功能要修改了,如果另一个功能要修改也要修改它就不符合这个原则了)

6.开发-封闭原则

  • 软件应该可以扩展,但是不可以修改
  • 面对新需求,对程序的改动应该通过增加新代码来实现,而不是修改现有的代码

7.面向对象的四大好处

  • 可维护
  • 可扩展
  • 可复用
  • 灵活性好

8.依赖倒转原则

  • 高层模块不应该针对底层模块设计,而是两个都应该针对抽象设计
  • 即不相互依赖,可以根据只有依赖的是同一个抽象就可以随意替换

9.里氏代换原则

  • 一个软件实体如果使用的是一个父类的话,那么它一定要适用于其子类,并且它察觉不出父类对象和子类对象的区别
  • 子类型兼容父类所有内容

10.装饰模式

  • 结构包括Component类、ConcreteComponent类、Decorator类和职责类
  • Component时一个抽象类,CincreteComponent类和Decorator类都是它的子类,职责类则是Decorator类的子类用于具体实现装饰
  • 思想是装饰行为(“例如穿白色短袖”)单独用一个类来表示,上一次装饰行为就作为一个对象传入本次装饰行为类,即把装饰这一本来应该由类内部实现的方法改成在客户端上调用不同类对象实现

11.代理模式

  • 为其他对象提供一种代理以控制对这个对象的访问
  • 使用场合:
    • 远程代理,为一个在另一个地址空间的对象提供在该空间的局部代表
    • 虚拟代理,根据需要创建开销很大的对象。例如一个包含很多图片的网页,一次载入很费时,此时会用一个虚拟代理,代理存着图片的路径和尺寸,在需要时(例如浏览或点击下载)才去下载
    • 安全代理:用来控制访问权限
    • 智能指引:方便对真实对象进行引用次数计算等一些操作

12.工厂方法模式