我很难理解java中mixins和策略之间的区别。他们都以不同的方式做同样的事情吗?任何人都可以为我清楚这一点吗?
谢谢!
答案 0 :(得分:3)
当您想要获取对象并“混合”新功能时使用Mixins,因此在Javascript中,您通常使用新方法扩展对象的原型。
使用策略模式,您的对象由“策略”对象组成,该对象可以替换为符合相同接口的其他策略对象(相同的方法签名)。每个策略对象都包含一个不同的算法,最终由业务逻辑的复合对象使用的算法由交换的策略对象决定。
所以基本上,这是你如何指定特定对象的功能的问题。通过: 1.扩展(继承自Mixin对象或多个Mixin对象)。 2.可交换策略对象的组成。
在Mixin和Strategy模式中,您正在远离子类化,这通常会产生更灵活的代码。
以下是JSFiddle上的策略模式的实现:https://jsfiddle.net/richjava/ot21bLje/
"use strict";
function Customer(billingStrategy) {
//list for storing drinks
this.drinks = [];
this.billingStrategy = billingStrategy;
}
Customer.prototype.add = function(price, quantity) {
this.drinks.push(this.billingStrategy.getPrice(price * quantity));
};
Customer.prototype.printBill = function() {
var sum = 0;
for (var i = 0; i < this.drinks.length; i++) {
sum += this.drinks[i];
}
console.log("Total due: " + sum);
this.drinks = [];
};
// Define our billing strategy objects
var billingStrategies = {
normal: {
getPrice: function(rawPrice) {
return rawPrice;
}
},
happyHour: {
getPrice: function(rawPrice) {
return rawPrice * 0.5;
}
}
};
console.log("****Customer 1****");
var customer1 = new Customer(billingStrategies.normal);
customer1.add(1.0, 1);
customer1.billingStrategy = billingStrategies.happyHour;
customer1.add(1.0, 2);
customer1.printBill();
// New Customer
console.log("****Customer 2****");
var customer2 = new Customer(billingStrategies.happyHour);
customer2.add(0.8, 1);
// The Customer pays
customer2.printBill();
// End Happy Hour
customer2.billingStrategy = billingStrategies.normal;
customer2.add(1.3, 2);
customer2.add(2.5, 1);
customer2.printBill();
Rob Dodson的解释:http://robdodson.me/javascript-design-patterns-strategy/
Addy Osmani在这里很好地解释了Mixin模式:http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mixinpatternjavascript