• 设计模式-模板模式


    简介

    模板方法模式是一种行为设计模式,它在父类中定义了一个操作的算法框架,允许子类在不改变算法结构的情况下重定义算法的某些步骤。这种模式是基于继承的,通过抽象类将通用的代码抽取到超类中,同时通过具体类实现或者改写算法中的某些特定步骤

    核心思想

    • 定义模板结构:在超类中定义一个模板方法,这个方法将各个步骤的执行顺序固定下来,形成一个框架。
    • 延迟到子类实现:将一些步骤的具体实现延迟到子类中,使得子类可以在不改变算法结构的条件下改变这些步骤的行为。

    使用场景

    • 当多个类中存在共同的行为,且这些行为在高层算法中的顺序已经确定,但各个步骤的具体实现可能不同时。
    • 当需要控制子类扩展的点时,模板方法只在特定点调用“钩子”操作,这样就只允许在这些点进行扩展

    具体实现

    假设我们有一个Game类,这个类定义了一个游戏的基本结构,包括初始化、开始游戏、结束游戏等步骤。我们将使用模板方法模式来定义这些步骤的结构,同时允许子类定义这些步骤的具体实现。

    class Game {
        // 模板方法
        play() {
            this.initialize();
            this.startPlay();
            this.endPlay();
        }
    
        initialize() {
            // 默认实现,可以被子类重写
            console.log("Initializing game...");
        }
    
        startPlay() {
            // 这个方法应由子类实现
            throw new Error("Method 'startPlay()' must be implemented.");
        }
    
        endPlay() {
            // 默认实现,可以被子类重写
            console.log("Ending game...");
        }
    }
    

    然后,我们可以创建具体的游戏类,它们继承自Game类并实现自己的startPlay方法

    class Chess extends Game {
        initialize() {
            super.initialize();
            console.log("Setting up a chess game.");
        }
    
        startPlay() {
            console.log("Starting a chess game.");
        }
    
        endPlay() {
            super.endPlay();
            console.log("Chess game finished.");
        }
    }
    
    class Soccer extends Game {
        initialize() {
            super.initialize();
            console.log("Setting up a soccer match.");
        }
    
        startPlay() {
            console.log("Starting a soccer match.");
        }
    
        endPlay() {
            super.endPlay();
            console.log("Soccer match finished.");
        }
    }
    

    客户端代码现在可以使用这些类来玩游戏

    const chess = new Chess();
    chess.play();  // 使用Chess类中定义的具体方法
    
    const soccer = new Soccer();
    soccer.play();  // 使用Soccer类中定义的具体方法
    

    总结

    • 模板方法模式在JavaScript中可以用来定义一个操作中的算法骨架,同时允许子类提供某些步骤的具体实现。
    • 这种模式可以帮助我们将复杂类的通用行为抽象化,同时提供足够的灵活性来在子类中定义特定的行为。
    • 这种方法很适合用于定义框架或库的基本功能,同时允许用户通过继承来扩展或修改这些功能。
  • 相关阅读:
    c++回顾与提高
    Python——第6章 Numpy库的使用
    助力企业前行——Scala&Spark最佳实践课程
    C++:C++模板(函数模板与类模板的使用)
    解决报错:fatal: Authentication failed for ‘https://github.com/*/*.git/‘
    一阶滤波器(一阶巴特沃斯滤波器)
    C语言----数组
    专科出身,2年进苏宁,5年跳阿里,论我是怎么快速晋升的?
    常见SQL错误用法案例和总结
    vue项目配置MongoDB的增删改查操作
  • 原文地址:https://blog.csdn.net/qq_34574204/article/details/139954533