一个例子 - 看尽JS中的访问者模式

  1. 为什么要用访问者模式:在OOP中,我们用类来组织代码,类的属性我们当然在类内部获取,方法也在内部实现,使用就new一个类调用方法,但是当我们需要对类的数据进行很多与类定义不相关的操作的时候,这个时候我们又不想污染类的对象,因为这些操作引起的副作用可能根本与类无关,那么我们就应该把这些操作抽离出来单独封装,但是你抽离出来还是要用类的数据呀,怎么办呢,好了,所有类实现一个访问的接口,接受访问者,内部调用访问者的行为,但是具体这些行为干了什么,是访问者在外面实现的,就好像你作为一个访问者去拜访朋友家,朋友说你可以在我家做饭,用我家东西,但是具体怎么做是你的事,你朋友家并不关心,这样,换朋友来访问,同样也可以让他们做饭,但是做饭的方式就不一样了撒

  2. 访问者的目的: 主要将稳定的数据结构和易变的操作分开,方便扩展多变的操作方法而保持稳定的数据结构

  3. 访问者的实现: talk is cheap, show you the code

// 定义奖金的访问者,在js中简单的用一个函数模拟,
// 如果在c#等强类型语言中,需要声明一个接口,不同的visitor实现不同的计算奖金方法,
// 比如下面的管理者和开发者奖金不一样
function bonusVisitor(employee) {
  if (employee instanceof Manager)
    employee.bonus = employee.salary * 2;
  if (employee instanceof Developer)
    employee.bonus = employee.salary;
}

// 定义员工类,注意继承此类的必须都带有accept这个接受visitor的方法,
// 就是用来接待访问者,进而内部用访问者调用自己方法实现一些操作,
// 此例中直接调用函数visitor(this)
class Employee {

  constructor(salary) {
    this.bonus = 0;
    this.salary = salary;
  }

  accept(visitor) {
    visitor(this);
  }
}

// 管理者实现员工类
class Manager extends Employee {
  constructor(salary) {
    super(salary);
  }
}

// 开发者实现员工类
class Developer extends Employee {
  constructor(salary) {
    super(salary);
  }
}

测试代码

   // 管理员工集合
    let employees = [];

    // 不同的员工
    const john = new Developer(4000);
    const christian = new Manager(10000);

   // 放入员工集合中
    employees.push(john);
    employees.push(christian);

     // 分别接收访问者并调用
    employees.forEach(e => {
      e.accept(bonusVisitor);
    });

参考:
https://www.runoob.com/design-pattern/visitor-pattern.html
https://cnblogs.com/Terrylee/archive/2006/07/17/334911.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • 原文链接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤独杂货铺阅读 5,412评论 0 3
  • 二千多年前,柏拉图曾经有一个著名的“洞穴寓言”。 一群人从小被囚禁在一个巨大的黑暗洞穴中,无法回头,只能看向洞穴深...
    微行天下阅读 8,289评论 0 1
  • 今天参加了县里的师德演讲比赛。整个过程没有什么惊险与刺激,自己发挥一般,所以得了一个三等奖。 准备阶段自己写稿子,...
    杏坛清莲阅读 2,967评论 0 0
  • 1.List ArrayList 、Vector 、LinkedList的区别? 答:ArrayList底层是数组...
    KD小帅阅读 4,014评论 0 1

友情链接更多精彩内容