模板方法模式

 

模板概念:

模板就是有一个规定的模式,然后每个人都可以根据自己的需求或情况去更新他。例如:简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历。在设计模式中,模板方法模式中模板和生活中模板概念非常类似。

模板方法模式的定义:

模板方法模式——在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。

模板方法模式的实现:

下面以生活中炒蔬菜为例来实现下模板方法模式。在现实生活中,做蔬菜的步骤都大致相同,如果我们针对每种蔬菜类定义一个烧的方法,这样在每个类中都有很多相同的代码,为了解决这个问题,我们一般的思路肯定是把相同的部分抽象出来到抽象类中去定义,具体子类来实现具体的不同部分,这个思路也正式模板方法的实现精髓所在,具体实现代码如下:

第一步:创建炒菜模板抽象类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace 模板方法模式
{
    public abstract class Vegetabel
    {
        public void CookVegetable()
        {
            MessageBox.Show("炒蔬菜的一般做法");
            this.PourOil();
            this.HeatOil();
            this.PourVegetable();
            this.Stirfry();
        }
        /// <summary>
        /// 炒菜完毕。
        /// </summary>
        private void Stirfry()
        {
            MessageBox.Show("炒菜完毕");
        }
        /// <summary>
        /// 油热了之后到蔬菜下去,具体哪儿种蔬菜有子类决定。
        /// </summary>
        public abstract void PourVegetable();
        /// <summary>
        /// 把油烧热。
        /// </summary>
        private void HeatOil()
        {
            MessageBox.Show("把油烧热");
        }
        /// <summary>
        /// 第一步倒油。
        /// </summary>
        private void PourOil()
        {
            MessageBox.Show("倒油");
        }
    }
}

第二步:创建具体炒菜类,并继承自炒菜模板类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace 模板方法模式
{
    /// <summary>
    /// 菠菜。
    /// </summary>
    public class Spinach : Vegetabel
    {
        public override void PourVegetable()
        {
            MessageBox.Show("菠菜倒进锅中");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace 模板方法模式
{
    /// <summary>
    /// 大白菜。
    /// </summary>
    public class ChineseCabbage: Vegetabel
    {
        public override void PourVegetable()
        {
            MessageBox.Show("到大白菜进锅中");
        }
    }
}

第三步:客户端调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace 模板方法模式
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // 创建一个菠菜实例并调用模板方法。
            Spinach spinach = new Spinach();
            spinach.CookVegetable();
        }
    }
}

模板方法模式的视图:

 

posted @ 2015-11-06 17:55  及乌及国  阅读(230)  评论(0编辑  收藏  举报