zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

固定模板,不同算法,就用『模板方法模式』

2023-02-18 16:47:11 时间

定义(Template Method)

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

类图

模板方法模式

启示

组装电脑一般包含三个部分,主机、显示器、输入设备(键鼠),而不同品牌电脑的组装都各不相同,但是最终组装成一部完整的电脑的步骤都是固定一样的。定义抽象类,暴露主机、显示器、输入设备(键鼠)的组装给具体厂商去实现,提供一个公共的最终组装方法。

代码

/// <summary>
    /// 组装电脑
    /// </summary>
    public abstract class AssembleComputer
    {
        /// <summary>
        /// 组装主机
        /// </summary>
        public abstract void BuildMainFramePart();

        /// <summary>
        /// 组装显示器
        /// </summary>
        public abstract void BuildScreenPart();

        /// <summary>
        /// 组装输入设备(键鼠)
        /// </summary>
        public abstract void BuildInputPart();

        /// <summary>
        /// 组装起来
        /// </summary>
        public void Assemble()
        {
            BuildMainFramePart();
            BuildScreenPart();
            BuildInputPart();
        }

    }

    /// <summary>
    /// 组装HP电脑
    /// </summary>
    public class AssembleHpComputer : AssembleComputer
    {
        public override void BuildMainFramePart()
        {
            Console.WriteLine("组装HP电脑的主板");
        }

        public override void BuildScreenPart()
        {
            Console.WriteLine("组装HP电脑的显示器");
        }

        public override void BuildInputPart()
        {
            Console.WriteLine("组装HP电脑的键盘鼠标");
        }
    }

    /// <summary>
    /// 组装HP电脑
    /// </summary>
    public class AssembleDellComputer : AssembleComputer
    {
        public override void BuildMainFramePart()
        {
            Console.WriteLine("组装Dell电脑的主板");
        }

        public override void BuildScreenPart()
        {
            Console.WriteLine("组装Dell电脑的显示器");
        }

        public override void BuildInputPart()
        {
            Console.WriteLine("组装Dell电脑的键盘鼠标");
        }
    }

优缺点

实现了代码复用,符合【OCP】
模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。

应用场景

当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。当构造过程必须允许被构造的对象有不同的表示时。

源码:

源代码C#

系列导航:

目录