`
kmplayer
  • 浏览: 510065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Method模式

阅读更多
1,总结:
基类中包含一个主方法,主方法由若干个子方法组成.
各个子方法的实现由具体的继承类各自实现.
包含一个钩子,决定某些可选方法是否实施.

2,贴个实例代码:
#include <iostream>
#include <memory>
using namespace std;

class CaffeineBeverage
{
public:
    virtual ~CaffeineBeverage() = 0;
	virtual void prepareRecipe()
	{
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
protected:
    virtual void brew() const = 0;
 	virtual void addCondiments() const = 0;
 	void boilWater() const
 	{
		cout << "Boiling water" << endl;
	}
 	void pourInCup() const
 	{
		cout << "Pouring into cup" << endl;
	}
};
CaffeineBeverage::~CaffeineBeverage() {};

class CaffeineBeverageWithHook
{
public:
    virtual ~CaffeineBeverageWithHook() = 0;
	public: virtual void prepareRecipe()
	{
		boilWater();
		brew();
		pourInCup();
		if( customerWantsCondiments() ) //hook
		{
			addCondiments();
		}
	}
	virtual void brew() const = 0;
	virtual void addCondiments() const = 0;
	virtual void boilWater() const //相同的方法
	{
		cout << "Boiling water" << endl;
	}
	virtual void pourInCup() const //相同的方法
	{
		cout << "Pouring into cup" << endl;
	}
protected:
    virtual bool customerWantsCondiments() const//这里还有个默认的...
	{
		return true;
	}
};
CaffeineBeverageWithHook::~CaffeineBeverageWithHook() {};

class Coffee : public CaffeineBeverage
{
public:
    void brew() const
    {
		cout << "Dripping Coffee through filter" << endl;
	}
	void addCondiments() const
	{
		cout << "Adding Sugar and Milk" << endl;
	}
};

class CoffeeWithHook : public CaffeineBeverageWithHook
{
public:
    void brew() const
    {
		cout << "Dripping Coffee through filter" << endl;
	}
 	void addCondiments() const
 	{
		cout << "Adding Sugar and Milk" << endl;
	}
	bool customerWantsCondiments() const
	{
		bool value = false;
		string answer = getUserInput();
		if( answer.find('y') != -1 )
		{
			value = true;
		}
		return value;
	}
 	string getUserInput() const
 	{
		string value;
		cout << "Would you like milk and sugar with your coffee (y/n)? " << endl;
		cin >> value;
		return value;
	}
};

class Tea : public CaffeineBeverage
{
public:
    void brew() const
    {
		cout << "Steeping the tea" << endl;
	}
	public: void addCondiments() const
	{
		cout << "Adding Lemon" << endl;
	}
};

class TeaWithHook : public CaffeineBeverageWithHook
{
public:
    void brew() const
    {
		cout << "Steeping the tea" << endl;
	}
 	public: void addCondiments() const
 	{
		cout << "Adding Lemon" << endl;
	}
  	bool customerWantsCondiments() const //重载了呀!!!
  	{
		bool value = false;
		string answer = getUserInput();
		if( answer.find('y') != -1 ) {
			value = true;
		}
		return value;
	}
	string getUserInput() const
	{
		string value;
		cout << "Would you like lemon with your tea (y/n)? " << endl;
		cin >> value;
		return value;
	}
};

int main()
{
    /*
	auto_ptr< Tea > tea( new Tea() );
	auto_ptr< Coffee > coffee( new Coffee() );

	cout << endl << "Making tea..." << endl;
	tea->prepareRecipe();

	cout << endl << "Making coffee..." << endl;
	coffee->prepareRecipe();
*/
	//auto_ptr< TeaWithHook > teaHook( new TeaWithHook() );
	auto_ptr< CoffeeWithHook > coffeeHook( new CoffeeWithHook() );

    TeaWithHook* teaHook = new TeaWithHook();
	cout << endl << "Making tea..."<< endl;
	teaHook->prepareRecipe();

	cout << endl << "Making coffee..."<< endl;
	coffeeHook->prepareRecipe();
    return 0;
}
分享到:
评论

相关推荐

    python设计模式——factorymethod模式(最新可编辑文档).doc

    python设计模式——factorymethod模式(最新可编辑文档)

    TemplateMethod 模式与代码重构

    TemplateMethod(模板方法)设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们在抽象类中定义一个算法的框架,同时允许子类在不改变算法结构的情况下重写算法中的特定步骤。通过...

    Factory Method 工厂方法模式(创建型模式)

    ### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...

    C#中的TemplateMethod模式问题分析

    TemplateMethod模式是一种行为设计模式,它允许在定义算法框架的同时,允许子类为算法的特定步骤提供实现。这种模式在C#中广泛应用于创建可扩展的代码结构,使得父类可以控制算法的流程,而具体的操作则由子类来完成...

    【Java设计模式-源码】Factory Method Pattern in Java: 使用多态制造增强灵活性

    **四、通过实际示例详细解释Factory Method模式** 实际示例: &gt; 想象一家物流公司需要递送不同类型的包裹:标准、快递和超大尺寸。该公司有一个中央系统来处理递送请求,但不知道每种包裹类型的具体处理方式。为了...

    结城浩《图解设计模式》笔记

    本笔记主要讲述了设计模式的基本概念和应用,包括 Iterator 模式、Adapter 模式、TemplateMethod 模式、FactoryMethod 模式和 Singleton 模式等。通过对这些设计模式的详细解释和示例代码的分析,我们可以更好地理解...

    常见的十种设计模式Java工程文件

    2. **Template Method模式**:Template Method模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 3. **Command模式**:Command模式...

    C++设计模式.pdf

    Template Method模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 #### Strategy模式 Strategy模式定义了一系列的算法,并将每一个...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    - **Template Method模式**:定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **Strategy模式**:定义了一系列算法,...

    Java设计模式(泡妞经典版)

    Factory Method 模式是一种将产品的创建过程交给子类去做的设计模式。Factory Method 模式可以使得客户端可以不需要知道具体的产品实现细节,而是通过工厂类来请求某种产品。 例如,在 Factory Method 模式的例子中...

    两篇android设计模式[归纳].pdf

    本文将重点讨论在Android框架设计中常用的两种设计模式:Observer模式和Template Method模式。 1. **Observer模式**: Observer模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    设计模式C++版(pdf版)

    Template Method模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **适用场景**:一次性实现一个算法的不变的部分...

    ASP.NET设计模式-杨明军译(源码)

    5.1.3 Template Method模式 5.1.4 State模式 5.1.5 Strategy模式 5.2 应用企业模式 5.2.1 Specification模式 5.2.2 Composite模式 5.2.3 Layer Supertype模式 5.3 应用设计原则 5.3.1 依赖倒置原则和依赖...

    设计模式学习笔记大全

    Factory Method模式是一种创建型模式,它定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样,工厂方法就把类的实例化推迟到子类中进行,增强了系统的灵活性和扩展性。 3. 原型模式(Prototype): ...

    设计模式03.DOC

    Factory Method模式则是在父类中定义创建对象的接口,由子类决定实例化哪个类。 以创建电脑游戏迷宫为例,迷宫由Room、Door和Wall等组件构成,每个Room对象有四个方向(North, South, East, West),并且通过...

    设计模式解析-英文

    180 第15章 共性与可变性分析 189 第16章 分析矩阵 196 第17章 Decorator模式 207 第六部分 其他重要模式 第18章 Observer模式 220 第19章 Template Method模式 231 第七部分 各种工厂模式 第20章 来自设计模式的...

    创建型模式(除singleton)外的四种模式简单实例

    3. **Factory Method模式**: - 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - 例如,我们可以定义一个`AnimalFactory`类,其中包含一个`...

    设计模式精解-GoF 23种设计模式解析

    Template Method模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **3.2 Strategy模式** Strategy模式定义了一系列算法,并将...

Global site tag (gtag.js) - Google Analytics