JavaScript 组合模式:随心所欲

前言

组合模式从名字就可以知道个大概了,把东西组合起来实现一个更加复杂的的功能。我们其实可以把一个手机看作是一个超级的组合体,因为它本身就是由很多个功能组合起来的。但在本文中,我不拿手机作例子。

组合模式的特点

所有个体都有统一的接口(方法)。个体可以相互组合成一个新的个体。

现在我们不妨来想一个智能家居的场景。家里 A、B、C 三个人,都想在到家之前一切都妥妥地:

  • A 想回到家前电视打开,饮水机开始加热。
  • B 想回到家时客厅电灯提前打开,电视打开,饮水机开始加热。
  • C 想回到家前扫地机器人开始打扫,热水器开始加热。

那么现在我们可以给他们三个人每人配一个快捷指令集。我们不妨假设有一个可以定时执行指令的处理器。

const television = {
  add(order) {
    throw Error('对不起,不能给我添加指令')
 },
  open: () => {
    console.log('电视已打开')
 }
}
// 饮水机
const water = {
  add(order) {
    throw Error('对不起,不能给我添加指令')
 },
  open: () => {
    console.log('饮水机已打开')
 }
}
// 热水器
const heater = {
  add(order) {
    throw Error('对不起,不能给我添加指令')
 },
  open: () => {
    console.log('热水器已打开')
 }
}
// 电灯
const lamp = {
  add(order) {
    throw Error('对不起,不能给我添加指令')
 },
  open: () => {
    console.log('电灯已打开')
 }
}
// 扫地机器人
const cleaner = {
  add(order) {
    throw Error('对不起,不能给我添加指令')
 },
  open: () => {
    console.log('扫地机器人已开始工作')
 }
}
// 快捷指令集
class HandlerCenter {
  orderList = []
  constructor() {}
  add(...order) {
    this.orderList = order
 }
  open() {
    for (let item of this.orderList) {
      item.open()
   }
 }
}
// 接下来我们给A、B、C 这三个人组合他们各自所的指令
// A
const aHandlerCenter = new HandlerCenter()
aHandlerCenter.add(television, water)
// B
const bHandlerCenter = new HandlerCenter()
bHandlerCenter.add(lamp, television, water)
// C
const cHandlerCenter = new HandlerCenter()
cHandlerCenter.add(cleaner, heater)
​
aHandlerCenter.open()
bHandlerCenter.open()
cHandlerCenter.open()

上面的 A、B、C 分别执行自己的指令集。

只要 A、B、C 三人愿意,我们甚至还可以把三个人的指令又组合到一个指令集里,像下面这样子

const abcHandlerCenter = new HandlerCenter()
abcHandlerCenter.add(aHandlerCenter, bHandlerCenter, cHandlerCenter)
abcHandlerCenter.open()

彪悍的人生不需要解释,一行代码 abcHandlerCenter.open() 走遍子孙后代,效果杠杠的,同时满足了 A、B、C 三个人的需要。看到组合模式的威力了吗?一层套一层,你想要多少层就有多少层,横纵拓展,如丝般顺滑。此刻我按奈不住心中的激动,给它起了个淘气又稳重的名字:"连环套"。

声明

1.原创文章,不经本站同意,不得以任何形式转载,如有不便,请多多包涵!

2.本文永久链接:http://yunkus.com/post/5e89edecb92397c5

3.如果觉得本文对你有帮助,或者解决了你的问题,不妨扫一扫右边的二维码打赏支持,你的一分一毫,可能会让世界变得更美好。

微信
扫一扫,赏我
支付宝
扫一扫,赏我