设计模式之八:模板方法模式

这篇具有很好参考价值的文章主要介绍了设计模式之八:模板方法模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

泡咖啡和泡茶的共同点:

  1. 把水煮沸
  2. 沸水冲泡咖啡/茶叶
  3. 冲泡后的水倒入杯子
  4. 添加糖和牛奶/柠檬
class CoffeineBeverage
{
public:
	void prepareRecipe()
	{
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}

private:
	void boilWater()
	{
		std::cout << "Boiling water" << std::endl;
	}

	virtual void brew() = 0;
	
	void pourInCup()
	{
		std::cout << "Pour in cup" << std::endl;
	}
	
	virtual void addCondiments() = 0;
};

在上面的代码种,prepareRecipe就是一个模板方法。

模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现(依赖子类提供某些或所有步骤的实现,父类拥有并保护这个算法)。

模板方法模式在一个方法中定义了一个算法的骨架,而且将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

class CaffeineBeverage
{
public:
	void prepareRecipe()
	{
		boilWater();
		brew();
		pourInCup();

        // hook 用法1
        // 如果算法中的某个部分是可选的
        // 可以用hook来控制
        if(hook())
        {
		    addCondiments();
        }
        
        // hook 用法2
        // 让子类有机会对即将发生的,或
        // 刚刚发生的步骤做出反应。像是
        // 一种 callback
        hook();
	}

private:
	void boilWater()
	{
		std::cout << "Boiling water" << std::endl;
	}

	virtual void brew() = 0;
	
	void pourInCup()
	{
		std::cout << "Pour in cup" << std::endl;
	}
	
	virtual void addCondiments() = 0;

    void hook()
    {
        std::cout << "Hook" << std::endl;
    }
};

Hook(钩子)这个方法可以什么都不做,子类视情况决定是否覆盖它们,也可以做一些默认的事情。

钩子的存在可以让子类有能力对算法的不同点进行挂钩。

if(customerWantsCondiments())
{
    addCondiments();
}

void addCondiments()
{
    // 子类可以自行决定什么时候需要添加调料
    return true; 
}

好莱坞原则:别调用我们,我们回调用你。此原则可以防止“依赖腐败”,避免高层和低层组件之间有明显的环状依赖,...。(高层组件可以调用低层,如CaffeineBeverage调用Coffee和Tea的方法)(由超类控制一切,当它们需要的时候,自然会去调用子类)

模板方法模式对创建框架来说很常见,由框架控制如何做事情,而框架使用者来指定框架算法中每个步骤的细节。

1. 用模板方法排序

public static void sort(Object[] a)
{
	Object aux[] = (Object[])a.clone();
	// mergeSort方法包含排序算法,依赖于compareTo方法的实现
	mergeSort(aux, a, 0, a.length, 0);
}

private static void mergeSort(Object src[], Object desc[], int low, int high, int off)
{
	for (int i = low; i < high; i++)
	{
        // 需要实现compareTo方法
		for (int j = i; j > low; && ((Comparable)dest[j-1].compareTo((Comparable)dest[j]) >0); j++)
		{
            // swap是一个具体方法,已经在数组类中定义
			swap(dest, j, j - 1);
		}

	}
	return;
}

Java中的sort并不是真正定义在超类中,我们需要实现Comparable接口,实现compareTo方法。文章来源地址https://www.toymoban.com/news/detail-680950.html

public class Duck implement Comparable
{
    String name;
    int weight;

    // ......
    // ......
    // ......

    public int compareTo(Object object)
    {
        Duck otherDucnk = (Duck)object;
        if(this.weight < otherDucnk.weight)
        {
            return -1;
        }
        else if ( ... ) { ... }
        else { ... }
    }
}
  • 模板方法的抽象类可以定义具体方法、抽象方法和钩子。
  • 策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
  • 工厂方法是模板方法的一种特殊版本。

到了这里,关于设计模式之八:模板方法模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】模板方法模式

    模板方法模式:定义一个操作中的算法骨架(父类),而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构来重定义该算法的 实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分需要改变,这时候可以使用模板方法模式,将容易变的部分抽

    2024年02月08日
    浏览(34)
  • 设计模式(13):模板方法模式

    实现一个功能时,整体步骤很固定,但是,某些部分易变。易变部分可以抽象出来,供子类实现。 非常繁琐,各个框架,类库中都有它的影子,比如常见的有: 数据库访问的封装 Junit单元测试 servlet中关于doGet/doPost方法调用 spring框架中各种Template shire中权限认证和授权都用到

    2024年04月16日
    浏览(33)
  • 设计模式(7)模板方法模式

    一、定义: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

    2024年02月12日
    浏览(25)
  • Java设计模式 (一) 模板方法设计模式

    什么是模板方法设计模式? 模板方法设计模式是一种行为型设计模式,它定义了一个算法的骨架,并将一些步骤的具体实现延迟到子类中。模板方法模式可以帮助确保在算法的不同部分中保持一致性,同时也允许子类根据需要进行具体实现。 模板方法模式的关键特点包括:

    2024年02月12日
    浏览(31)
  • js设计模式:模板方法模式

    父类定义一个整体的模板框架,将具体的方法行为定义到子类中。 模板方法主要是封装行为中的固定部分,同时允许子类对方法进行扩展

    2024年02月22日
    浏览(29)
  • 设计模式【行为型】-- 模板方法模式

          模板方法模式是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的具体实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 模板方法模式基于一个抽象类或接口定义算法的骨架,该骨架由一个模板

    2024年02月16日
    浏览(35)
  • 设计模式(六):模板方法模式(行为型模式)

    Template Method,模板方法:定义一个操作中的算法的骨架,而将一 些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即 可以重定义该算法得某些特定步骤。 举例说明 奶茶制作过程,第一步加牛奶,第二步加糖,第三步加其他配料。第三步对于不同口味的奶

    2024年02月21日
    浏览(34)
  • 14.python设计模式【模板方法模式】

    内容:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色: 抽象类(AbstractClass):定义抽象的原子操作(钩子操作);实现一个模板方法作为算法的骨架。 具体类(ConcreteClass):

    2024年02月15日
    浏览(27)
  • C++设计模式之 模板方法模式

    【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】         --什么是模板方法模式(第18种设计模式)         模板方法模式 (Template Method Pattern)是⼀种 行为型设计模式 , 它定义了⼀个算法的骨架,将 ⼀些

    2024年01月21日
    浏览(36)
  • C#设计模式之---模板方法模式

    模板方法模式(Template Method Pattern)定义了一个算法的步骤,并允许子类为一个或多个步骤提供其实现方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。模板方法模式是比较简单的一种设计模式,作为模板的方法要定义在父类中,在方法的定义中使用

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包