结构型模式


1.适配器模式 特点:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。 后台返回的数据格式不同,可以通过适配器修改。例: 后台返回json格式的数据,通过方法检索出自己需要的数据进行显示,这个方法即为适配器。 通常用来避免项目迭代后数据格式或者方法名发生改变出现的错误。 最优解:项目开发过程中前后端协商讨论数据格式、文件名等代码规范。

2.代理模式 为一个对象提供一个代用品或占位符,以便控制对他的访问。 在一个对象中调用其他对象的方法(函数可以实例化成对象) 保护代理:数据拦截(可以在函数中条件判断拦截数据从而执行不同下文) 虚拟代理:数据通过这些代理传递没有被拦截(可实现图片懒加载)

3.桥接模式 把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。 需要一种方式让对象和行为分离,便于随意拼接。 优点:分离抽象接口及其实现部分,提高可拓展性。 缺点:增加系统的理解和设计难度

boy,girl,piano,guitar
boy-piano,boy-guitar,girl-piano,girl-guitar
function Boy(instrument) {
      this.sayHi = function() {
          console.log('hi, 我是男生')
      }
      this.playInstrument = function() {
          instrument.play()
      }
  }
  function Girl(instrument) {
      this.sayHi = function() {
          console.log('hi, 我是女生')
      }
      this.playInstrument = function() {
          instrument.play()
      }
  }
  function Piano() {
      this.play = function() {
          console.log('钢琴开始演奏')
      }
  }
  function Guitar() {
      this.play = function() {
          console.log('吉他开始演奏')
      }
  }
  let piano = new Piano()
  let guitar = new Guitar()
  let pianoBoy = new Boy(piano)
  pianoBoy.playInstrument()
  let guitarGirl = new Girl(guitar)
  guitarGirl.playInstrument()

4.装饰模式 动态地给一个对象添加一些额外的职责。(类似魂斗罗的子弹种类变化,原来子弹还在) 优点:装饰类和被装饰类可以独立发展,不会相互耦合,继承的一个替代模式。 缺点:多层装饰,比较复杂。 类似闭包,在函数对象中添加调用其他函数,给对象增加功能

5.组合模式 由小对象构建大对象,常和装饰者模式一起使用 优点:通过对象的多态表现,使对单个对象和组合对象的使用具有一致性 缺点:系统负担,性能 小函数添加进一个对象(可以是实例化的函数),通过该函数去调用各种小函数,囊括这些功能。

创建型模式


行为型模式