战略情势
定义一系列的算法,把它们一个个封装起来, 而且使它们可互相替代。本情势使得算法可独立于运用它的客户而变化。
战略情势是把一个类中常常转变或许未来能够转变的部份提取出来作为一个接口,然后在类中包括这个对象的实例,如许类的实例在运行时就能够随便挪用完成了这个接口的类的行动。
战略情势要素
1.Strategy:战略接口,用来束缚一系列详细的战略算法。Context运用这个接口来挪用详细的战略,完成定义的战略。
2.ConcreteStrategy:详细的战略完成,也就是详细的算法完成。
3.Context:上下文,担任与详细的战略交互,一般上下文会持有一个真正的战略完成。
实例
现在车的价钱能够依据市场需求更改随时调解,关于差别销售商订购辆数举行优惠。
// 战略情势
var DP = require("./DesignPattern.js");
function Strategy() {
DP.Interface(this, ['calPrice']);
}
function Nodiscount() {
this.__proto__ = new Strategy();
this.calPrice = function (price, num) {
return price * num;
}
}
function Disount1() {
this.__proto__ = new Strategy();
this.calPrice = function (price, num) {
return price * num * 0.95;
}
}
function Context(strategy) {
var _strategy=strategy;
this.calPrice = function (price, num) {
return _strategy.calPrice(price, num)
}
}
var nodiscount = new Nodiscount();
var disount1 = new Disount1();
var nodiscountContext = new Context(nodiscount);
console.log("Nodiscount战略购置3辆总金额: " + nodiscountContext.calPrice(10000,3));
var disount1Context = new Context(disount1);
console.log("disount1战略购置3辆总金额: " + disount1Context.calPrice(10000,3));
战略情势长处:
1.算法能够自在切换。
2.防止运用多重前提推断。
3.扩展性优越。
战略情势瑕玷:
1.战略类会增加。
2.一切战略类都须要对外暴露。
实用场景:
1.如果在一个体系内里有很多类,它们之间的区分仅在于它们的行动,那末运用战略情势能够动态地让一个对象在很多行动中挑选一种行动。
2.一个体系须要动态地在几种算法中挑选一种。
3.一个类定义了多种行动, 而且这些行动在这个类的操纵中以多个前提语句的情势涌现。将相干的前提分支移入它们各自的Strategy类中以替代这些前提语句。