设计模式之模板模式
程序员文章站
2022-06-13 13:51:08
...
目录
1.模板模式是什么?
在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式
2.模板模式的作用是什么?
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(意思是:一些方法通用,不通用的方法由子类重写)
3.模板模式的优点是什么?
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制,子类实现
4.模板模式的缺点是什么?
- 不通用的方法需要子类实现,导致类的数量增多,使得系统更加庞大
5.模板模式的使用场景是什么?
- 有多个子类共有的方法,且逻辑相同
- 重要的、复杂的方法,可以考虑作为模板方法
6.模板模式的UML类图
7.实现模板模式
想了这么一个例子,那就是解决问题的方式,每个人的解决问题的方式不同,这里把处理问题的方式分为四个步骤,发现问题原因,找解决方案,确定解决方案,实施解决方案,那么这里假定发现问题原因和实施这两个过程对于任何人来说都是一样的,而他们的找解决方案的过程和确定解决方案的过程不一样。
首先看一下UML图:
①PeopleAbstract:
abstract class PeopleAbstract
{
public void SolveProblem()
{
FindReason();
FindSolution();
DetermineSolution();
ExecuteSolution();
}
private void FindReason()
{
Console.WriteLine("Step 1: find the cause of the problem");
}
public abstract void FindSolution();
public abstract void DetermineSolution();
private void ExecuteSolution()
{
Console.WriteLine("Step 4: execute the plan");
}
}
②EfficientPeople:
class EfficientPeople : PeopleAbstract
{
public override void FindSolution()
{
Console.WriteLine("Step 2: highly effective people find solutions by constantly thinking");
}
public override void DetermineSolution()
{
Console.WriteLine("Step 3: highly effective people use public opinion to identify solutions");
}
}
③InefficientPeople
class InefficientPeople : PeopleAbstract
{
public override void FindSolution()
{
Console.WriteLine("Step 2: inefficient people find a lot of solutions through baidu and Google");
}
public override void DetermineSolution()
{
Console.WriteLine("Step 3: inefficient people randomly identify a solution");
}
}
④调用:
class Program
{
public static void Main(string[] args)
{
PeopleAbstract efficientPeople = new EfficientPeople();
PeopleAbstract inefficientPeople = new InefficientPeople();
efficientPeople.SolveProblem();
Console.WriteLine("--------------------------------");
inefficientPeople.SolveProblem();
Console.ReadLine();
}
}
结果:
可以看到,第一步和第四步高效人士和低效人士的过程是一样的,是因为他们的处理方式是一样的,而第二步和第三步的过程是不一样的,是因为他们有各自的处理方式。
8.团队中程序使用的模板模式
对于团队中,我们有一个专门用于出货的服务,其中有一个抽象基类BaseCarrier的shipShipment方法,它充当了模板模式中的算法方法,算法中有些方法是通用的所以由自己实现,有些方法不是通用的所以由子类重写。(但其实这里存在一个疑问,就是那些不是完全通用的方法没有被当做抽象方法处理,而是都在基类中有实现,即使没有实现也是一个空壳,但整个设计逻辑确实太像模板模式了,所以我在想这可能是模板模式的一个变体吧哈哈哈哈)