模板方法模式,基于继承实现的简单的设计模式(设计模式与开发实践 P11)

文章目录

模板方法模式是一种基于继承的设计模式,由两部分构成:

  • 抽象父类(一般封装了子类的算法框架)
  • 具体的实现子类

实现

简单地通过继承就可以实现

举例

足球 赛 和 篮球赛 都有 3 个步骤,初始化,开始游戏,结束游戏

我们发现他们都有这个过程,就可以把相同的点提取出来,设置成一个模板!

这里我们举例的 3 个方法都是抽象方法,有时如果子类的行为是一致的,可以直接实现具体方法~

csharp 复制代码
using System;

public abstract class Game
{
    public void Play()
    {
        Initialize();
        StartGame();
        EndGame();
    }

    protected abstract void Initialize();

    protected abstract void StartGame();

    protected abstract void EndGame();
}

public class FootballGame : Game
{
    protected override void Initialize()
    {
        Console.WriteLine("Football game initialized. Setting up teams and players.");
    }

    protected override void StartGame()
    {
        Console.WriteLine("Football game started. Kickoff!");
    }

    protected override void EndGame()
    {
        Console.WriteLine("Football game ended. Final score and statistics displayed.");
    }
}

public class BasketballGame : Game
{
    protected override void Initialize()
    {
        Console.WriteLine("Basketball game initialized. Setting up teams and players.");
    }

    protected override void StartGame()
    {
        Console.WriteLine("Basketball game started. Tip-off!");
    }

    protected override void EndGame()
    {
        Console.WriteLine("Basketball game ended. Final score and statistics displayed.");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Game footballGame = new FootballGame();
        footballGame.Play();

        Console.WriteLine();

        Game basketballGame = new BasketballGame();
        basketballGame.Play();
    }
}

应用

常被架构师用来搭建项目的框架,程序员负责往里面填空

比如 Java 程序员经常用 HttpServlet 来开发项目,他包含 7 个生命周期,每个生命周期都对应一个 do 方法,这些方法就需要 HttpServlet 的子类进行 具体实现

钩子 Hook

根据上面的例子,如果有一种非常特别的球赛不需要 Initialize 就可以开始呢?

我们可以在容易变化的方法处设置一个 Hook ,他可以有一个默认的实现,需不需要 Hook 挂钩则由子类自行决定,这样程序就有了变化的可能~

csharp 复制代码
using System;

public abstract class Game
{
    public void Play()
    {
        Initialize();
        StartGame();
        EndGame();
    }

    protected virtual void Initialize()
    {
        Console.WriteLine("Game initialized. Setting up teams and players.");
        // 在这里添加挂钩(Hook)行为
        AdditionalInitialization();
    }

    protected abstract void StartGame();

    protected abstract void EndGame();

    protected virtual void AdditionalInitialization()
    {
        // 默认的挂钩行为为空
    }
}

public class FootballGame : Game
{
    protected override void StartGame()
    {
        Console.WriteLine("Football game started. Kickoff!");
    }

    protected override void EndGame()
    {
        Console.WriteLine("Football game ended. Final score and statistics displayed.");
    }

    protected override void AdditionalInitialization()
    {
        Console.WriteLine("Additional initialization for Football game.");
    }
}

public class BasketballGame : Game
{
    protected override void StartGame()
    {
        Console.WriteLine("Basketball game started. Tip-off!");
    }

    protected override void EndGame()
    {
        Console.WriteLine("Basketball game ended. Final score and statistics displayed.");
    }

    protected override void AdditionalInitialization()
    {
        Console.WriteLine("Additional initialization for Basketball game.");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Game footballGame = new FootballGame();
        footballGame.Play();

        Console.WriteLine();

        Game basketballGame = new BasketballGame();
        basketballGame.Play();
    }
}
相关推荐
新手unity自用笔记6 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
qinzechen7 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
yufei-coder10 小时前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio
dangoxiba11 小时前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
AitTech11 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
hiyo58514 小时前
C#中虚函数和抽象函数的概念
开发语言·c#
蜡笔小新..16 小时前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
开心工作室_kaic17 小时前
基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic
c语言·javascript·数据库·vue.js·c#·旅游·actionscript
性感博主在线瞎搞18 小时前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer31118 小时前
JavaScript 中的组合模式(十)
javascript·设计模式