15_模板模式

模板模式是一种行为型设计模式,它定义了一个抽象类作为算法的骨架,而将一些步骤的具体实现延迟到子类中。模板模式提供了一个统一的算法流程,但允许子类根据需要重写算法的具体步骤。

模板模式有三个主要角色:

  1. 抽象类(Abstract Class):定义了算法的骨架,包含了一个模板方法以及一些抽象方法或钩子方法。模板方法定义了算法的流程,而抽象方法或钩子方法则由子类实现具体的步骤。

  2. 具体类(Concrete Class):继承自抽象类,并实现了抽象方法或钩子方法,完成具体的步骤。

  3. 客户端(Client):使用模板方法来调用算法,无需关心具体步骤的实现。

模板模式的工作原理如下:

  1. 抽象类定义了一个模板方法,该方法定义了算法的流程,包含了一系列的步骤调用。

  2. 抽象类中的步骤可以是抽象方法或钩子方法,由子类来实现具体的步骤。

  3. 客户端通过调用抽象类的模板方法来执行算法,具体步骤的实现由子类决定。

模板模式的优点包括:

  1. 提供了一个统一的算法流程,降低了代码的重复性。

  2. 可以在不改变算法结构的情况下,扩展或修改算法的具体步骤。

  3. 提供了一个钩子方法,允许子类对算法进行扩展或修改。

模板模式适用于以下场景:

  1. 当有一个算法的流程固定,但其中某些步骤的实现可能变化时,可以使用模板模式。

  2. 当需要在不改变算法整体结构的情况下,对算法的某些步骤进行扩展或修改时,可以使用模板模式。

总结而言,模板模式通过定义一个抽象类作为算法的骨架,将一些步骤的具体实现延迟到子类中。它提供了一个统一的算法流程,但允许子类根据需要重写算法的具体步骤,提高了代码的可复用性和扩展性。

 

public class ImageBuffer
    {
        public byte[] Data { get; set; }
    }

 

Abstract Class

/// <summary>
    /// 相机
    /// </summary>
    public abstract class CameraBase
    {
        /// <summary>
        /// 模板方法
        /// </summary>
        public void Initialize()
        {
            DoInitialize();
            DoStart();
        }

        public abstract void DoInitialize();
        public abstract void DoStart();

        public ImageBuffer Trigger()
        {
            Console.WriteLine("获取一张图像!");

            return new ImageBuffer();
        }
    }

 

Concrete Class

/// <summary>
    /// 海康相机
    /// </summary>
    public class HaiKangCamera : CameraBase
    {
        public override void DoInitialize()
        {
            Console.WriteLine("引入海康厂加提供的API,调用API中LoadDevice()");
        }

        public override void DoStart()
        {
            Console.WriteLine("找到本机所有相机,并定义回调函数,开始工作...");
        }
    }
/// <summary>
    /// 大华相机
    /// </summary>
    public class DaHuaCamera : CameraBase
    {
        public override void DoInitialize()
        {
            Console.WriteLine("初始化大华相机...");
        }

        public override void DoStart()
        {
            Console.WriteLine("大华相机开始工作...");
        }
    }

 

Client

internal class Client
    {
        public void Start()
        {
            CameraBase dh = new DaHuaCamera();
            dh.Initialize();
            var image1 = dh.Trigger();

            CameraBase hk=new HaiKangCamera();
            hk.Initialize();
            var image2=hk.Trigger();
        }   
    }

调用

static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

posted @ 2024-03-12 11:01  野码  阅读(6)  评论(0编辑  收藏  举报