数码资讯
对Javascript系列的深入理解(41):设计模式的详细模板方法
介绍 模板方法(材料)定义一个操作中的算法的骨架,而延迟到子类的一些步骤。模板的方法允许子类重新定义算法中的某些步骤不改变一个算法的结构。 模板方法是代码重用的一种基本技术,特别是在类库中,因为它们提取类库中的公共行为,模板方法导致了反向控制结构。这种结构是传说中的好莱坞规则,也就是说,不要找我们。
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
介绍
模板方法(材料)定义一个操作中的算法的骨架,而延迟到子类的一些步骤。模板的方法允许子类重新定义算法中的某些步骤不改变一个算法的结构。
模板方法是代码重用的一种基本技术,特别是在类库中,因为它们提取类库中的公共行为,模板方法导致了反向控制结构。这种结构是传说中的好莱坞规则,也就是说,不要找我们。我们指的是一类调用类而不是另一类的操作,它体现在面向对象编程语言的抽象类和继承抽象类(抽象方法)的子类中。
文本
例如,泡茶和咖啡有相同的步骤,如沸腾的水(boilwater),啤酒(酿造),倒入杯(pouroncup),加小料(addcondiments等),但每种饮料的酿造方法和添加一些材料是不同的,所以我们可以使用模板方法实现这一主要步骤。
首先,我们首先定义抽象步骤:
复制代码代码如下所示:
Var CaffeineBeverage =函数(){()
};
(caffeinebeverage.prototype.preparerecipe =功能){
This.boilWater();
This.brew();
This.pourOnCup();
如果(this.customerwantscondiments()){
如果要添加小物料,请添加
this.addcondiments();
}
};
(CaffeineBeverage.prototype.boilWater函数){
console.log(煮水!;
};
(caffeinebeverage.prototype.pouroncup =功能){
console.log(喝的喝到杯!;
};
(CaffeineBeverage.prototype.brew函数){
抛出新错误()必须重写此方法!;
};
(caffeinebeverage.prototype.addcondiments =功能){
抛出新错误()必须重写此方法!;
};
默认加小材质
(caffeinebeverage.prototype.customerwantscondiments =功能){
返回true;
};
这一功能扩展的原型的所有步骤的基础上,和主要步骤,酿造和材料加小步骤没有实现,对应于特定的功能饮料来实现的,也无论是小材料(customerwantscondiments)返回true,当亚功能可以重写,重写的价值。
以下两个功能是咖啡和茶是一个相应的功能:
复制代码代码如下所示:
/咖啡
咖啡=函数(){()
CaffeineBeverage.apply(本);
};
coffee.prototype =新caffeinebeverage();
(coffee.prototype.brew =功能){
console.log(咖啡从咖啡机);
};
(coffee.prototype.addcondiments =功能){
console.log(加糖和牛奶);
};
(coffee.prototype.customerwantscondiments =功能){
返回确认()你想加糖和牛奶吗;
};
茶
var =函数(){()
CaffeineBeverage.apply(本);
};
tea.prototype =新caffeinebeverage();
(tea.prototype.brew =功能){
console.log(泡泡茶!;
};
(tea.prototype.addcondiments =功能){
console.log(加柠檬!;
};
(tea.prototype.customerwantscondiments =功能){
返回确认()您想添加柠檬吗;
};
另外,使用确认后,可以让用户选择添加不加小料,非常好,不是吗
总结
模板方法应用于下列情况:
1。一个算法的不变部分一次实现,变量行为留给子类来实现。
2、将每个子类中的公共行为提取出来,集中在公共父类中,避免代码重复,将差异划分为新操作。最后,用一种新的模板捕鱼方法来代替这些不同的代码。
三.控制子类扩展名,模板方法只调用特殊点上的钩子操作,以便扩展允许在这些点上扩展。
与策略模式不同,模板方法使用继承来改变算法的一部分,而策略模式使用委托来改变整个算法。
模板方法(材料)定义一个操作中的算法的骨架,而延迟到子类的一些步骤。模板的方法允许子类重新定义算法中的某些步骤不改变一个算法的结构。
模板方法是代码重用的一种基本技术,特别是在类库中,因为它们提取类库中的公共行为,模板方法导致了反向控制结构。这种结构是传说中的好莱坞规则,也就是说,不要找我们。我们指的是一类调用类而不是另一类的操作,它体现在面向对象编程语言的抽象类和继承抽象类(抽象方法)的子类中。
文本
例如,泡茶和咖啡有相同的步骤,如沸腾的水(boilwater),啤酒(酿造),倒入杯(pouroncup),加小料(addcondiments等),但每种饮料的酿造方法和添加一些材料是不同的,所以我们可以使用模板方法实现这一主要步骤。
首先,我们首先定义抽象步骤:
复制代码代码如下所示:
Var CaffeineBeverage =函数(){()
};
(caffeinebeverage.prototype.preparerecipe =功能){
This.boilWater();
This.brew();
This.pourOnCup();
如果(this.customerwantscondiments()){
如果要添加小物料,请添加
this.addcondiments();
}
};
(CaffeineBeverage.prototype.boilWater函数){
console.log(煮水!;
};
(caffeinebeverage.prototype.pouroncup =功能){
console.log(喝的喝到杯!;
};
(CaffeineBeverage.prototype.brew函数){
抛出新错误()必须重写此方法!;
};
(caffeinebeverage.prototype.addcondiments =功能){
抛出新错误()必须重写此方法!;
};
默认加小材质
(caffeinebeverage.prototype.customerwantscondiments =功能){
返回true;
};
这一功能扩展的原型的所有步骤的基础上,和主要步骤,酿造和材料加小步骤没有实现,对应于特定的功能饮料来实现的,也无论是小材料(customerwantscondiments)返回true,当亚功能可以重写,重写的价值。
以下两个功能是咖啡和茶是一个相应的功能:
复制代码代码如下所示:
/咖啡
咖啡=函数(){()
CaffeineBeverage.apply(本);
};
coffee.prototype =新caffeinebeverage();
(coffee.prototype.brew =功能){
console.log(咖啡从咖啡机);
};
(coffee.prototype.addcondiments =功能){
console.log(加糖和牛奶);
};
(coffee.prototype.customerwantscondiments =功能){
返回确认()你想加糖和牛奶吗;
};
茶
var =函数(){()
CaffeineBeverage.apply(本);
};
tea.prototype =新caffeinebeverage();
(tea.prototype.brew =功能){
console.log(泡泡茶!;
};
(tea.prototype.addcondiments =功能){
console.log(加柠檬!;
};
(tea.prototype.customerwantscondiments =功能){
返回确认()您想添加柠檬吗;
};
另外,使用确认后,可以让用户选择添加不加小料,非常好,不是吗
总结
模板方法应用于下列情况:
1。一个算法的不变部分一次实现,变量行为留给子类来实现。
2、将每个子类中的公共行为提取出来,集中在公共父类中,避免代码重复,将差异划分为新操作。最后,用一种新的模板捕鱼方法来代替这些不同的代码。
三.控制子类扩展名,模板方法只调用特殊点上的钩子操作,以便扩展允许在这些点上扩展。
与策略模式不同,模板方法使用继承来改变算法的一部分,而策略模式使用委托来改变整个算法。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。