在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
该实例基于WPF实现,直接上代码,下面为三层架构的代码。
一 Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 设计模式练习.Model.模板模式
{
//学习类: 步骤为找资料、找老师、上课、做笔记、阶段练习、纳为已用、学习完成
public abstract class Learn
{
//规定执行流程的步骤:不能标记为abstruct、overide、virtual
public void learning()
{
//执行学习步骤
LookInformation();
LookTeacher();
Start_Class();
WriteNote();
Practice();
Use();
LearnFinsh();
}
public abstract void LookInformation();
public abstract void LookTeacher();
public abstract void Start_Class();
public abstract void WriteNote();
public abstract void Practice();
public abstract void Use();
/// <summary>
/// 学习完成
/// </summary>
/// <exception cref="NotImplementedException"></exception>
public abstract void LearnFinsh();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 设计模式练习.Model.模板模式
{
internal class XiaoQiangLearn : Learn
{
public string StepInfo { get; set; }
public override void LearnFinsh()
{
StepInfo += "学习完成\r\n";
}
public override void LookInformation()
{
StepInfo += "查找学习资料\r\n";
}
public override void LookTeacher()
{
StepInfo += "寻找老师\r\n";
}
public override void Practice()
{
StepInfo += "练习\r\n";
}
public override void Start_Class()
{
StepInfo += "开始上课\r\n";
}
public override void Use()
{
StepInfo += "学以致用\r\n";
}
public override void WriteNote()
{
StepInfo += "写笔记\r\n";
}
}
}
二 View
<Window x:Class="设计模式练习.View.模板模式.TemplateWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:设计模式练习.View.模板模式"
mc:Ignorable="d"
Title="TemplateWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<RichTextBox VerticalScrollBarVisibility="Visible" >
<FlowDocument>
<Paragraph >
<Run Text="{Binding Log}" />
</Paragraph>
</FlowDocument>
</RichTextBox>
<Button Content="开始执行学习计划" Command="{Binding StartLernCommand}" Grid.Column="1"/>
</Grid>
</Window>
三 ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 设计模式练习.Model.模板模式;
namespace 设计模式练习.ViewModel.模板模式
{
partial class TemplateWindow_ViewModel : ObservableObject
{
[ObservableProperty]
private string log;
[RelayCommand]
private void StartLern()
{
XiaoQiangLearn xiaoQiangLearn = new XiaoQiangLearn();
xiaoQiangLearn.learning();
Log += xiaoQiangLearn.StepInfo+"\r\n\r\n";
}
}
}