15_模板模式
模板模式是一种行为型设计模式,它定义了一个抽象类作为算法的骨架,而将一些步骤的具体实现延迟到子类中。模板模式提供了一个统一的算法流程,但允许子类根据需要重写算法的具体步骤。
模板模式有三个主要角色:
-
抽象类(Abstract Class):定义了算法的骨架,包含了一个模板方法以及一些抽象方法或钩子方法。模板方法定义了算法的流程,而抽象方法或钩子方法则由子类实现具体的步骤。
-
具体类(Concrete Class):继承自抽象类,并实现了抽象方法或钩子方法,完成具体的步骤。
-
客户端(Client):使用模板方法来调用算法,无需关心具体步骤的实现。
模板模式的工作原理如下:
-
抽象类定义了一个模板方法,该方法定义了算法的流程,包含了一系列的步骤调用。
-
抽象类中的步骤可以是抽象方法或钩子方法,由子类来实现具体的步骤。
-
客户端通过调用抽象类的模板方法来执行算法,具体步骤的实现由子类决定。
模板模式的优点包括:
-
提供了一个统一的算法流程,降低了代码的重复性。
-
可以在不改变算法结构的情况下,扩展或修改算法的具体步骤。
-
提供了一个钩子方法,允许子类对算法进行扩展或修改。
模板模式适用于以下场景:
-
当有一个算法的流程固定,但其中某些步骤的实现可能变化时,可以使用模板模式。
-
当需要在不改变算法整体结构的情况下,对算法的某些步骤进行扩展或修改时,可以使用模板模式。
总结而言,模板模式通过定义一个抽象类作为算法的骨架,将一些步骤的具体实现延迟到子类中。它提供了一个统一的算法流程,但允许子类根据需要重写算法的具体步骤,提高了代码的可复用性和扩展性。
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(); }