← 返回博客列表

模式特点

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

类图

类图

应用场景

示例代码(C++)

// 抽象基类 - 机器人驱动
class RobotDriver {
public:
    // 模板方法 - 定义算法骨架,final 防止子类修改
    void connect() final {
        openDevice();
        handshake();
        loadParams();
        if (needSelfTest()) selfTest();  // 钩子方法
        std::cout << "连接完成" << std::endl;
    }
protected:
    virtual void openDevice() = 0;
    virtual void handshake() = 0;
    virtual void loadParams() = 0;
    virtual void selfTest() { std::cout << "默认自检" << std::endl; }
    virtual bool needSelfTest() { return true; }
};

// 具体类 - 新时达机器人
class XSTADriver : public RobotDriver {
protected:
    void openDevice() override { std::cout << "打开以太网设备" << std::endl; }
    void handshake() override { std::cout << "TCP 握手" << std::endl; }
    void loadParams() override { std::cout << "加载新时达参数" << std::endl; }
};

// 具体类 - 埃斯顿机器人
class EstunDriver : public RobotDriver {
protected:
    void openDevice() override { std::cout << "打开串口设备" << std::endl; }
    void handshake() override { std::cout << "Modbus 握手" << std::endl; }
    void loadParams() override { std::cout << "加载埃斯顿参数" << std::endl; }
    bool needSelfTest() override { return false; }  // 不需要自检
};

XSTADriver xsta; xsta.connect();   // 流程统一,实现各异
EstunDriver estun; estun.connect();