模板模式与策略模式/template模式与strategy模式/行为型模式

时间:2022-04-11 09:46:36

模板模式

模版模式,又被称为模版方法模式,它可以将工作流程进行封装,并且对外提供了个性化的控制,但主流程外界不能修改,也就是说,模版方法模式中,将工作的主体架构规定好,具体类可以根据自己的需要,各自去实现。

几个要点,针对java:

  1. 抽象父类(防止实例化),公共方法(public),规定好工作流
  2. 抽象父类规定好抽象方法(protected),具体由子类实现,父类将抽象方法加入自己的工作流
  3. 具体子类实现父类的抽象方法
  4. 任意实例化的子类,都会按照父类工作流工作,只是部分(抽象方法实现)不同
abstract class Handle
{
public void handle()
{
a();
b();
c();
}
void a(){}
void c(){}
protected abstract void b();
} class Handle1 extends Handle
{
@override
protected override void b()
{
Console.WriteLine("Handle1");
}
}
class Handle2 extends Handle
{
@override
protected override void b()
{
Console.WriteLine("Handle2");
}
}

调用:

Handle handle=new Handle1();
handle.handle();

任意子类都会按照规定的工作流a()->b()->c()执行,部分(b方法)由具体子类去定义。

策略模式

针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

public interface ICalculator {
public int calculate(int a,int b);
}
public class Plus implements ICalculator {
@Override
public int calculate(int a,int b) {
return a+b;
}
}
public class Minus implements ICalculator {
@Override
public int calculate(int a,int b) {
return a-b;
}
} Class Calculator{
ICalculator calculator;
public Calculator(ICalculator calculator){
this.calculator=calculator;
}
public int calculate(int a,int b){
return calculator.calculate(a,b);
}
} 当需要加法计算时:
Calculator plusCalculator=new Calculator(new Plus());
int result=plusCalculator.calculate(3,5);

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

策略模式和模板模式场景对比:

策略模式的应用场景

1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),一般会定义一个接口规范,使用不同的策略方式去实现它

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

而模版方法模式的应用场景

1、多个类区别在于主流程中的某个细节

2、客户可以自已实现模版里的抽象方法

3、对客户隐藏具体的实现流程(方法的组合的顺序)

参考这里

参考这里