定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换
简单来说是:定义一系列的算法,把它们各自封装成策略类,算法被封装在策略类内部的方法里,在客户对 Context 发起请求的时候,Context 总是把请求委托给这些策略对象中间的某一个进行计算。目的将算法的使用与算法的实现分离开来
每个策略对象负责的算法已被各自封装在对象内部,当我们发起计算奖金时,它们会返回不同的计算结果,这正是对象多态性的体现。替换 Context 中当前保存的策略对象,便能执行不同的算法得到我们想要的结果。
利用组合、委托、多态等技术和思想,减少多重条件语句
符合开放封闭原则,把算法封装在独立的对象中,使得对象易于切换、易于理解、易于扩展
代码逻辑可复用,减少重复工作
将行为分布在各个对象中,并让这些对象各自负责自己的行为,这正是面向对象设计的优点。
例子: 计算绩效奖金
const calculateBonus = function (level, salary) {
if (level == "S") {
return salary _ 4;
} else if (level == "A") {
return salary _ 3;
} else if (level == "B") {
return salary \* 2;
} else {
return salary;
}
};
console.log(calculateBonus("S", 10000));
const performanceS = function (salary) {
return salary _ 4;
};
const performanceA = function (salary) {
return salary _ 3;
};
const performanceB = function (salary) {
return salary \* 2;
};
const calulateBonus2 = function (level, salary) {
if (level === "S") {
return performanceS(salary);
} else if (level === "A") {
return performanceA(salary);
} else if (level === "B") {
return performanceB(salary);
} else {
return salary;
}
};
console.log(calulateBonus2("S", 10000));
const PS = function () {};
PS.prototype.calculate = function (salary) {
return salary _ 4;
};
const PA = function () {};
PA.prototype.calculate = function (salary) {
return salary _ 3;
};
const PB = function () {};
PB.prototype.calculate = function (salary) {
return salary \* 2;
};
const Bons4 = function () {
this.salary = null;
this.strategy = null; // 绩效等级对应的策略对象,
};
Bons4.prototype.setSalary = function (salary) {
this.salary = salary; // 设置原始工资
};
Bons4.prototype.setStrategy = function (strategy) {
this.strategy = strategy; // 设置绩效等级对应的策略对象,
};
Bons4.prototype.getBons4 = function () {
return this.strategy.calculate(this.salary); // 设置绩效等级对应的策略对象,
};
const bonus4 = new Bons4();
bonus4.setSalary(10000);
bonus4.setStrategy(new PS());
console.log(bonus4.getBons4());
在 JavaScrpt 中,函数也是对象,简单直接的做法是把 strategy 直接定义为函数
const strategire = {
S: function (salary) {
return salary _ 4;
},
A: function (salary) {
return salary _ 3;
},
B: function (salary) {
return salary \* 2;
},
};
// 2. Context 接受用户的请求
const calulateBonus3 = function (level, salary) {
return strategire[level](salary);
};
console.log(calulateBonus3("S", 10000));