将对象组合成树形结构,以表示“部分-整体”的层次结构。另外一个好处是通过对象的多态性表现,使得用户对单个对象具有一致性!

万能遥控器

通过组合模式我们实现一个超级万能遥控器、主要功能是把下面三组功能组合到一起一并执行

  • 打开空调
  • 打开电视和音响
  • 关门、开电脑、登录QQ ```javascript // 组合类 class MacriComMand { constructor() {

    1. this.commandsList = [];

    }

    add(command) {

    1. this.commandsList.push(command)

    } execute() {

    1. for (let i = 0, command; command = this.commandsList[i++];) {
    2. command.execute()
    3. }

    } }

class OpenAcCommand{ execute(){ console.log(‘打开空调’) } }

class OpenTvCommad{ execute(){ console.log(‘打开电视’) } }

class OpenSoundCommand{ execute(){ console.log(‘打开音响’) } }

class CloseDoorCommand{ execute(){ console.log(‘关门’) } }

class OpenPcCommad{ execute(){ console.log(‘打开电脑’) } }

class OpenQQCommand{ execute(){ console.log(‘登录QQ’) } }

// 打开空调(功能) let macriComMand1 = new MacriComMand(); macriComMand1.add(new OpenAcCommand()); // 打开电视和音响 let macriComMand2 = new MacriComMand(); macriComMand2.add(new OpenTvCommad()); macriComMand2.add(new OpenSoundCommand()); // 关门、开电脑、登录QQ let macriComMand3 = new MacriComMand(); macriComMand3.add(new OpenPcCommad()); macriComMand3.add(new OpenQQCommand());

/** 组合成超级命令(递归结构) */ let macriComMand = new MacriComMand(); macriComMand.add(macriComMand1) macriComMand.add(macriComMand2) macriComMand.add(macriComMand3)

// 五秒后执行超级命令、 setTimeout( () =>{ macriComMand.execute() },5000) ```

总结

优点

  • 定义层次:清楚的定义分层次的复杂对象;
  • 符合开放-封闭原则

    缺点

  • 使得设计变得更加抽象