模板方法模式

一、定义

定义一个操作中的算法的框架,而将一些步骤延迟到了子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。

二、实例

来一个经典的脑筋急转弯。

  1. 把一个大象装进冰箱要几个步骤?
  2. 然后把一个长颈鹿装进冰箱要几个步骤?

三、UML类图

  

四、钩子函数

钩子就是给子类一个授权,让子类来可重定义模板方法的某些步骤,说白了就是虚函数。

五、优缺点

优点

  • 封装了算法骨架,提高了代码复用性,简化了使用难度;
  • 封装不变部分,扩展可变部分,满足开闭原则。

缺点

  • 算法骨架不易更改;
  • 扩展时,可能会产生很多子类。

六、代码

1.AnimalToFridge.cs

public abstract class AnimalToFridge
    {
        public void Do()
        {
            OpenFridge();

            BeforePutIntoFridge();

            PutIntoFridge();

            CloseFridge();
        }

        private void OpenFridge()
        {
            Console.WriteLine("把冰箱门打开");
        }

        protected virtual void BeforePutIntoFridge() {           
        }

        protected abstract void PutIntoFridge();

        private void CloseFridge()
        {
            Console.WriteLine("把冰箱门关上");
        }
    }

2.ElephantToFridge.cs

 public class ElephantToFridge : AnimalToFridge
    {
        protected override void PutIntoFridge()
        {
            Console.WriteLine("把大象放进去");
        }
    }

3.GiraffeToFridge.cs

public class GiraffeToFridge : AnimalToFridge
    {
        protected override void BeforePutIntoFridge()
        {
            Console.WriteLine("把大象弄出来");
        }

        protected override void PutIntoFridge()
        {
            Console.WriteLine("把长颈鹿放进去");
        }
    }

4.Program.cs

internal class Program
    {
        static void Main(string[] args)
        {
            AnimalToFridge elephant = new ElephantToFridge();
            elephant.Do();
            Console.WriteLine("--------------");
            AnimalToFridge giraffe = new GiraffeToFridge();
            giraffe.Do();
        }
    }

运行结果:

 

posted on 2023-06-01 11:18  一只向上爬的小蜗牛  阅读(6)  评论(0编辑  收藏  举报