数据交换之中介者模式

export default class DataMediator {
  constructor() {
    this.store = new Map();
  }

  notify(sender, event, data = undefined) {
    let res;
    if (sender && event) {
      switch (event) {
        case 'get':
          res = this.get(sender);
          break;

        case 'set':
          res = this.set(sender, data);
          break;

        default:
          break;
      }
    }
    return res;
  }

  set(sender, data) {
    this.store.set(sender, this.deepCopy(data));
    return this.store.get(sender);
  }

  get(sender) {
    return this.store.get(sender);
  }

  findFirst = (list, f) => list.filter(f)[0]

  deepCopy(obj, cache = []) {
    if (obj === null || typeof obj !== 'object') {
      return obj;
    }

    const hit = this.findFirst(cache, (c) => c.original === obj);
    if (hit) {
      return hit.copy;
    }

    const copy = Array.isArray(obj) ? [] : {};
    cache.push({
      original: obj,
      copy,
    });

    Object.keys(obj).forEach((key) => {
      copy[key] = this.deepCopy(obj[key], cache);
    });

    return copy;
  }
}

// 测试代码

import DataMediator from '<path>/data_mediator';

function getTestValue() {
  return {
    a: {
      c: [{ e: 'e', f: 'f', g() { return { m: 'm' }; } }],
      d: 'd',
    },
    b: 'b',
  };
}

describe('data mediator class', () => {
  it('deepCopy', () => {
    const dm = new DataMediator();
    const testValue = getTestValue();
    const gFun1 = testValue.a.c[0].g;
    const resFun1 = gFun1();
    const testRes = dm.deepCopy(testValue);
    const gFun2 = testRes.a.c[0].g;
    const resFun2 = gFun2();
    expect(testValue === testRes).toBe(false);
    expect(testRes).toEqual(testValue);
    expect(resFun1).toEqual(resFun2);
  });

  it('notify', () => {
    const dm = new DataMediator();
    const testValue = getTestValue();
    dm.notify('test', 'set', testValue);
    dm.notify('test2', 'set', 'string');
    expect(dm.store instanceof Map).toBe(true);
    expect(dm.store.has('test')).toBe(true);
    expect(dm.store.has('test2')).toBe(true);
    const resValue1 = dm.notify('test', 'get');
    expect(resValue1).toEqual(testValue);
    expect(resValue1 === testValue).toBe(false);
    const resValue2 = dm.notify('test2', 'get');
    expect(resValue2 === 'string').toBe(true);
  });
});

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值