(29)C#设计模式——模板方法

博客介绍了模板方法模式,以银行存款单为例,说明其将多个类的共有内容提取到模板的思想。该模式基于代码复用,把相同代码放父类,不同方法放子类。需准备抽象类,部分逻辑具体实现,抽象方法由子类完成,子类可重定义算法特定步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们去银行存钱的时候,银行会给你一张存款单,这张存款单就是一个模板,把一些公共的内容提取出来,留下部分内容让用户来填写。在软件系统中,将多个类的共有内容提取到一个模板中的思想就是模板方法模式的思想。

模板方法模式就是基于代码复用技术,在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法放在不同的子类中。

在模板方法模式中,需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法。

定义

定义以一个操作算法中的骨架,将这些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

实例

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

namespace _9TempaleMethod
{
    //测试类
    class Program
    {
        static void Main(string[] args)
        {
            Spinach sponach = new Spinach("菠菜");
            sponach.Way();
            Console.WriteLine();
            Cabage cabage = new Cabage("大白菜");
            cabage.Way();
        }
    }
    //定义抽象类Vegetable
    public abstract class Vegetable
    {
        private string _name;
        public Vegetable(string Name):base()
        {
            this._name = Name;
        }
        //定义炒蔬菜的一般做法,其中将第三部定义为抽象方法,由具体的子类去实现
        public  void Way()
        {
            Console.WriteLine("炒{0}的一般做法:",this._name);
            this.Pouroil();
            this.Heatoil();
            this.pourVegetable();
            this.fry();
        }
      
        public void Pouroil()
        {
            Console.WriteLine("倒油");
        }
        public void Heatoil()
        {
            Console.WriteLine("把油烧热");
        }
        public abstract void pourVegetable();
        public void fry()
        {
            Console.WriteLine("翻炒");
        }
       
    }
    //实现模板方法中的pourVegetable方法
    public class Spinach : Vegetable
    {
        public Spinach(string Name) : base(Name)
        {
            
        }

        public override void pourVegetable()
        {
            Console.WriteLine("把菠菜倒进锅里");
        }
    }
    实现模板方法中的pourVegetable方法
    public class Cabage : Vegetable
    {
        public Cabage(string Name) : base(Name)
        {

        }

        public override void pourVegetable()
        {
            Console.WriteLine("把大白菜倒进锅里");
        }
    }
}
/*output:
炒菠菜的一般做法:
倒油
把油烧热
把菠菜倒进锅里
翻炒

炒大白菜的一般做法:
倒油
把油烧热
把大白菜倒进锅里
翻炒
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值