夸克之书

  • 首页
  • 科普
  • 笔记
  • C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. C#
  3. 正文

23种常见的设计模式(4):模板方法模式

2020-01-03 664点热度 0人点赞 0条评论

首先我们要知道的是,模板方法模式是一种非常非常简单的模式。但是简单不代表不实用,模板方法模式也是一种应用非常非常广泛的模式。可能大家在编写程序的时候已经无数次的应用到了,但是却不知道它有一个非常高大上的名字:模板方法模式。

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

举一个很简单的例子。某天我们不想996了,然后去开了一家电脑店,给客户组装电脑。但是组装的电脑配置肯定是根据价格来定的,不可能3000块的电脑我们给装一个Z390的主板+i7 9700K的CPU撒,如果有这样的电脑店,先给我来10台??!但是不同配置电脑组装的步骤肯定都是一样的,都需要安装电源、主板、CPU、内存和硬盘(不要和我杠为什么没有显卡)。于是我们就定义一个组装规则,每次装电脑的时候更具这个规则来组装电脑,只是更具价格组装电脑的配置不同罢了。

这天来了两个客户,一个需要装一台性价比高一些的电脑,于是我们推荐了AMD平台。另一个客户不差钱,只要性能,于是我们推荐了INTEL平台的9900K。然后开工,我们就来组装这两台电脑。

为了规范组装流程,我们先来定义一个组装流程模板:

public abstract class IComputerDiy
{
    /// <summary>
    /// 组装的电脑肯定要能给跑起来才是一台合格的电脑
    /// </summary>
    public void Run()
    {
        this.AddPower();
        this.AddBoard();
        this.AddCPU();
        this.AddRAM();
        this.AddDisk();
    }

    /// <summary>
    /// 安装电源
    /// </summary>
    public abstract void AddPower();

    /// <summary>
    /// 安装主板
    /// </summary>
    public abstract void AddBoard();

    /// <summary>
    /// 安装CPU
    /// </summary>
    public abstract void AddCPU();

    /// <summary>
    /// 安装内存条
    /// </summary>
    public abstract void AddRAM();

    /// <summary>
    /// 安装硬盘
    /// </summary>
    public abstract void AddDisk();
}

上面这个DIY抽象类定义了如何去装一台电脑,我们只需要按照这个模板,用不同的零件装好我们的电脑就行了。

我们先来组装AMD平台的:

/// <summary>
/// 用AMD CPU的一般性能的CPU
/// </summary>
public class AMDNormalPC : IComputerDiy
{
    public override void AddBoard()
    {
        Console.WriteLine("我是B450的主板,我装AMD的CPU");
    }

    public override void AddCPU()
    {
        Console.WriteLine("我是CPU 锐龙5 3600,我也很不错哦。");
    }

    public override void AddDisk()
    {
        Console.WriteLine("我是硬盘,我叫SN550。");
    }

    public override void AddPower()
    {
        Console.WriteLine("我是电源,没有我电脑就跑步起来。");
    }

    public override void AddRAM()
    {
        Console.WriteLine("我是内存,16GB。");
    }
}

然后是Intel平台的:

/// <summary>
/// 用Intel CPU的性能很强劲的电脑
/// </summary>
public class IntelPowerfulPC : IComputerDiy
{
    public override void AddBoard()
    {
        Console.WriteLine("我是Z390的主板,我装INTEL的CPU。");
    }

    public override void AddCPU()
    {
        Console.WriteLine("我是CPU 9900K,嗯~我很保值。");
    }

    public override void AddDisk()
    {
        Console.WriteLine("我是硬盘,我叫傲腾905p。");
    }

    public override void AddPower()
    {
        Console.WriteLine("我是电源,海韵的哦~");
    }

    public override void AddRAM()
    {
        Console.WriteLine("我是内存,32GB DDR4 4000MHZ。");
    }
}

可以看到,我们按照流程组装电脑的时候,不同的电脑选用不同的配件即可。用设计模式来说就是继承抽象类IComputerDiy之后,分别实现对于的抽象方法即可。

好了,电脑组装好了,我们来测试一下能不能正常运行。

static void Main(string[] args)
{
    IComputerDiy computer;

    Console.WriteLine("AMD的电脑:");
    computer = new AMDNormalPC();
    computer.Run();

    Console.WriteLine();
    Console.WriteLine("Intel的电脑:");
    computer = new IntelPowerfulPC();
    computer.Run();

    Console.ReadKey(false);
}

跑一下。

23种常见的设计模式(4):模板方法模式插图
模板方法模式demo

这就是模板方法模式,怎么样,是不是很简单?

再看看模板方法模式的优点和缺点。

优点:

· 封装不变部分。将暴露在外面的方法进行封装,调用人员无需关心封装的部分,在将需要实现的部分实现后直接调用即可。
· 便于维护,反正我又不用管抽象的部分。

缺点:

· 项目复杂度的提升。如果正在或者维护较大项目,就知道滥用模板方法模式有多糟糕了。由于子类的执行结果将会影响到父类,调试和阅读代码将会是一件很难受的事情。

本篇代码下载:点击下载

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

Afirefish

夸克之内,别有洞天

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Afirefish

夸克之内,别有洞天

搜索文章
分类目录
  • C# (28)
  • Linux (3)
  • 树莓派 (13)
  • 物联网 (19)
  • 科普 (4)
  • 笔记 (30)
  • 默认 (44)
最新 热点 随机
最新 热点 随机
树莓派PWM风扇控制 PVE重启后LVM Thin数据丢失,错误:Volume group "****" has insufficient free space (128 extents): 4048 required. OpenWrt配置SmartDNS OpenWrt x86安装Frpc Intel网卡开机显示Initializing Intel(R) Boot Agent GE v1.5.50 IdentityServer4证书创建 免费本地解析域名(locallocal.cn),支持HTTPS 使用淘宝npm以及安装cnpm
Steam饥荒专用服务器搭建你见过哪些有趣的代码?修改PostgreSQL数据库默认用户postgres密码在VS Code开发Arduino项目Error response from daemon: cannot stop container: ******: Cannot kill container *******:.....单机Docker搭建FastDFSC# Json序列化时将长整型(long)属性序列化为Json字符串使用淘宝npm以及安装cnpm
ESP8266 SmartConfig配置连网 在VS Code开发Arduino项目 树莓派4 Buster换源 近期学习计划整理 23种常见的设计模式(8):中介者模式 严肃一点的排序算法(2) – 面条排序 23种常见的设计模式(2):工厂方法模式 解决问题:The context cannot be used while the model is being created
最近评论
发布于 2 周前(02月21日) 好的谢谢,那我只能通过kill杀死推流指令进程来实现了。
发布于 2 周前(02月21日) 要用这个项目的话,你得自己拉代码来改了。做这玩意儿主要是考虑全天候的,没考虑过关[笑哭]
发布于 2 周前(02月21日) 就是想问有没有能通过代码控制的关闭推流的指令,而不需要手动控制。我想设置一个按钮来控制开始推流和结束...
发布于 2 周前(02月20日) 唔,没懂你意思,直接拔电源不就行了。不拔电源关闭推流服务也行撒。
发布于 2 周前(02月20日) 你好,我想问一下,如果不想推流了,该用什么方法停止树莓派推流呢?
书签
  • 打赏
  • 毒鸡汤(有点意思)
  • 米店
  • 金鱼直播间
放松一下
https://www.quarkbook.com/wp-content/uploads/2020/09/Yanni-Nightingale.flac
用户您好!请先登录!
登录 注册

COPYRIGHT © 2020 夸克之书. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

蜀ICP备15036129号-9

登录
注册|忘记密码?