首页 > 其他分享 >行为型设计模式-模板方法(template method)模式

行为型设计模式-模板方法(template method)模式

时间:2024-08-27 14:21:30浏览次数:13  
标签:coffee 步骤 self template 子类 设计模式 方法 method 模板

通俗示例

想象一下你正在制作一杯咖啡,制作咖啡的步骤大致相同,但有些步骤可以根据个人口味进行调整,比如选择咖啡豆、添加糖和奶等。在这种情况下,可以定义一个“制作咖啡”的模板,它规定了制作咖啡的基本步骤,但将某些步骤的具体实现留给子类完成。这就是模板方法模式的一个例子,其中模板定义了算法的骨架,而将一些步骤的实现延迟到子类中。

通俗解释

模板方法模式是一种行为型设计模式,它在一个方法中定义一个算法的骨架,将算法的某些步骤延迟到子类中实现。模板方法模式允许子类在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式的组成通常包括以下几部分:

  • 抽象类(Abstract Class):定义了一个或多个抽象操作,以及一个模板方法。这个模板方法定义了算法的骨架,并调用在这些抽象操作。
  • 具体类(Concrete Class):实现抽象类中的抽象操作,也可以覆盖模板方法中的可钩子操作(hook)。

模板方法模式的优点

  • 复用性:模板方法定义了算法的骨架,提高了代码的复用性。
  • 扩展性:子类可以覆盖特定的步骤,从而实现特定的行为。
  • 维护性:模板方法模式有助于维护一个一致的方法接口。

Python代码示例

以下是一个模板方法模式的简单实现:

from abc import ABC, abstractmethod

# 抽象类
class CoffeeMaker(ABC):
    def make_coffee(self):
        self.boil_water()
        self.brew_coffee_beans()
        self.add_condiments()
        print("Coffee is ready!")
    
    def boil_water(self):
        print("Boiling water...")
    
    @abstractmethod
    def brew_coffee_beans(self):
        pass
    
    @abstractmethod
    def add_condiments(self):
        pass

# 具体类
class LatteMaker(CoffeeMaker):
    def brew_coffee_beans(self):
        print("Brewing coffee beans for latte...")
    
    def add_condiments(self):
        print("Adding milk and sugar for latte...")

class BlackCoffeeMaker(CoffeeMaker):
    def brew_coffee_beans(self):
        print("Brewing coffee beans for black coffee...")
    
    def add_condiments(self):
        print("No condiments for black coffee.")

# 客户端代码
if __name__ == "__main__":
    latte_maker = LatteMaker()
    latte_maker.make_coffee()
    
    print()
    
    black_coffee_maker = BlackCoffeeMaker()
    black_coffee_maker.make_coffee()

在这个例子中,CoffeeMaker是一个抽象类,它定义了make_coffee这个模板方法,该方法规定了制作咖啡的步骤。同时,它还定义了两个抽象方法brew_coffee_beansadd_condiments,这两个方法需要在子类中实现。LatteMakerBlackCoffeeMaker是具体类,它们实现了抽象方法,从而定义了制作拿铁和黑咖啡的具体步骤。

总结

模板方法模式通过在一个方法中定义算法的骨架,将算法的某些步骤的实现推迟到子类中,从而允许子类在不改变算法结构的情况下,重新定义算法中的某些步骤。这种模式特别适用于那些具有多个步骤,其中一些步骤经常变化而另一些保持不变的情况。

标签:coffee,步骤,self,template,子类,设计模式,方法,method,模板
From: https://blog.csdn.net/linkedin_21843693/article/details/141461873

相关文章

  • BAdam A Memory Efficient Full Parameter Optimization Method for Large Language M
    目录概BAdam代码LuoQ.,YuH.andLiX.BAdam:Amemoryefficientfullparameteroptimizationmethodforlargelanguagemodels.arXivpreprint,2024.概本文介绍了一种Blockcorrdinatedescent(BCD)的训练方式.BAdam当模型本身很大的时候,训练它会成为一......
  • 057 Project Setup & First Methods
    示例index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>VueBa......
  • C++ 设计模式——享元模式
    C++设计模式——享元模式C++设计模式——享元模式1.主要组成成分2.享元模式内部状态3.享元模式外部状态4.逐步构建享元模式4.1抽象享元类定义4.2具体享元类实现4.3享元工厂类实现4.4主函数5.享元模式UML图享元模式UML图解析6.享元模式的优点7.享元模......
  • 设计模式基础
    1.面向对象设计的原则(七大原则)1.1单一职责(SPR:SingleResponsibilitiesPrinciple):一个类应只负责一个功能领域的相关职责,即只有一个使它变化的原因1.2开放闭合(OCP:Open-ClosePrinciple):软件实体应对扩展开发,对修改关闭,即实体可以扩展,但不能在原来的实体上修改1.3里氏代换(LSP:......
  • 网站提示405 Method Not Allowed:请求行中指定的请求方法不被允许怎么办
    当网站提示 405MethodNotAllowed 时,这意味着服务器理解了您的请求,但是拒绝了请求中指定的HTTP方法(如GET、POST、PUT等)。这通常是因为服务器被配置为仅接受特定类型的请求方法,而您使用的请求方法不在允许的范围内。以下是解决 405MethodNotAllowed 错误的一些常见方......
  • 设计模式2个黄鹂鸣翠柳-《分析模式》漫谈23
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集“AnalysisPatterns”的第一章有这么一句:The"GangofFour"bookhashadmuchmoreinfluenceinsoftwarepatternsthanAlexander'swork,and three outofthose four auth......
  • C++学习随笔——简单的单例设计模式实例
    点击查看代码#include<iostream>classSingleton{private://私有化构造函数,防止外部实例化Singleton(){std::cout<<"SingletonInstanceCreated!"<<std::endl;}//删除拷贝构造函数和赋值运算符,防止拷贝实例Singleton(constSin......
  • 第四章:行为型模式(11种)《Java设计模式宝典:从入门到精通》
      在进入第四章之前,我为大家准备了设计模式专栏的快速访问链接,方便大家随时查阅:《Java设计模式宝典:从入门到精通》专栏目录地址,点击我即可快速访问到所有设计模式的章节,不漏掉一处学习的知识 [点赞]等会儿兄弟们,这篇文章的干货真的是满满的!......
  • 【设计模式基础版】观察者模式
    观察者模式(ObserverPattern)是一种**行为型设计模式**,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者(观察者)都会收到通知并自动更新。观察者模式常用于需要自动通知多个对象状态变化的场景,例如事件处理系统、订阅-发布系统等。所以也被称作“发布-订......
  • 设计模式——六大原则
    一、六大设计原则1.单一职责原则:应该有且仅有一个原因引起类的变更2.里氏替换原则:子类可替换父类。a)子类必须完全实现父类的方法b)子类可以有自己的个性c)子类实现父类方法时,入参可放大d)子类实现父类方法时,输出参数可缩小3.依赖倒置原则:高层模块......