模板模式-C#实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_shenbing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值