在模板模式(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、virtualpublic 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";}}
}