其它设计模式

优先级划分依据

  • 不常用
  • 对应不到经典的应用场景

创建型

原型模式

概念

  • clone自己,生成一个新对象;
  • java默认有clone接口,不用自己实现;

示例

// 一个原型 对象
const prototype = {
  getName: function(){
    return this.first + '' + this.last
  },
  say: function(){
    alert('hello');
  }
}

// 基于原型创建x
let x = Object.create(prototype);
x.first = "A";
x.last = "B";
alert(x.getName());
x.say();
// 基于原型创建y
let y = Object.create(prototype);
y.first = "C";
y.last = "D";
alert(y.getName());
y.say();

对比JS中的原型prototype

  • prototype可以理解为ES6 class的一种底层原理;
  • 而class是实现面向对象的基础,并不是服务于某个模式;
  • 若干年后ES6全面普及,可能会忽略掉prototype;
  • Object.create却会长久存在;

结构型

桥接模式

概念

  • 用于把抽象化与实现化解耦
  • 使得二者可以独立变化

组合模式

概念

  • 生成树形结构,表示“整体-部分”关系;
  • 让整体和部分都具有一致的操作方式;

享元模式

概念

  • 共享内存(主要考虑内存,而非效率);
  • 相同的数据,共享使用;

行为型

策略模式

概念

  • 不同策略分开处理;
  • 避免出现大量if...else 或者 switch...case

模板方法模式

  • ...

职责链模式

概念

  • 一步操作可能分为多个职责角色来完成;
  • 把这些角色都分开,然后用一个链串起来;
  • 将发起者和各个处理者进行隔离;

示例

// 请假审批,需要组长审批、经理审批、最后总监审批
class Action {
  constructor(name){
    this.name = name
    this.nextAction = null
  }
  setNextAction(action){
    this.nextAction = action
  }
  handle() {
    corfsole.log(`${this.name}审批`)
    if (this.nextAction != null) {
      this.nextAction.handle()
    }
  }
}
let a1 = new Action('组长')
let a2 = new Action('经理')
let a3 =new Action('总监')
a1.setNextAction(a2)
a2.setNextAction(a3)
a1.handle()

JS中的链式操作

  • 职责链模式和业务结合较多,JS中能联想到链式操作;
  • jQuery的链式操作 Promise.then 的链式操作;

命令模式

概念

  • 执行命令时,发布者和执行者分开
  • 中间加入命令对象,作为中转站

示例

class Receiver {
  exec(){
    console.log('执行')
  }
}
class Command {
  constructor(receiver){
    this.receiver = receiver;
  }
  cmd(){
    console.log('触发命令')
    this.receiver.exec();
  }
}
class Invoker {
  constructor(command){
    this.command = command
  }
  ivoke(){
    console.log('开始');
    this.command.cmd();
  }
}
// 士兵
let soldier = new Receiver();
// 小号手
let trumpeter = new Command(soldier);
// 将军
let general = new Invoker(trumpeter);
general.ivoke();

JS中的应用

  • 网页富文本编辑器操作,浏览器封装了一个命令对象;
  • document.execCommand('bold');
  • document.execCommand('undo');

备忘录模式

概念

  • 随时记录一个对象的状态变化
  • 随时可以恢复之前的某个状态(如撤销功能)

中介者模式

  • ...

访问者模式

概念

  • 将数据操作和数据结构进行分离

解释器模式

概念

  • 描述语言语法如何定义,如何解释和编译
最后更新时间:
贡献者: DESKTOP-ER5718D\zt