设计模式5 行为模式

行为模式,目录:
模式方法模式
命令模式
策略模式观察者模式

模板方法模式:冲咖啡,冲茶水

[email protected]:~$ cat main.cpp 
#include <iostream>
using namespace std;

//抽象的制作饮料方法
class MakeDrink
{
public:
	//1 把水煮开
	void boil() {
		cout << "把水煮开" << endl;
	}
	//2 冲某物
	virtual void brew() = 0;
	//3 从大杯倒入小杯
	void putInCup()
	{
		cout << "把冲泡好的饮料 从大杯倒入小杯" << endl;
	}
	//4 加一些酌料
	virtual void addThings() = 0;

	//钩子函数, hook
	virtual bool CustomWantAddThings() {
		return true;
	}

	//业务的逻辑的统一模板 
	void make() {
		boil();
		brew(); //子类
		putInCup(); 

		if (CustomWantAddThings() == true) {
			addThings(); //子类的多态
		}
	}
};

//制作咖啡
class MakeCoffee :public MakeDrink
{
public:
	MakeCoffee(bool isAdd)
	{
		this->isAdd = isAdd;
	}
	//2 冲某物
	virtual void brew()
	{
		cout << "冲泡咖啡豆" << endl;
	}

	//4 加一些酌料
	virtual void addThings()  {
		cout << "添加糖和牛奶" << endl;
	}

	virtual bool CustomWantAddThings() {
		return isAdd;
	}

private:
	bool isAdd;
};

//冲泡茶叶
class MakeTea :public MakeDrink
{
public:
	MakeTea(bool isAdd)
	{
		this->isAdd = isAdd;
	}

	//2 冲某物
	virtual void brew() {
		cout << "冲泡 茶叶" << endl;
	}
	//4 加一些酌料
	virtual void addThings()  {
		cout << "添加 柠檬 或者 菊花" << endl;
	}

	virtual bool CustomWantAddThings() {
		return isAdd;
	}

private:
	bool isAdd;
};

int main(void)
{
	MakeDrink *makeCoffee = new MakeCoffee(true);
	makeCoffee->make();

	cout << " ------ " << endl;

	MakeDrink *makeTea = new MakeTea(false);
	makeTea->make();

	return 0;
}
[email protected]:~$ g++ main.cpp  && ./a.out 
把水煮开
冲泡咖啡豆
把冲泡好的饮料 从大杯倒入小杯
添加糖和牛奶
 ------ 
把水煮开
冲泡 茶叶
把冲泡好的饮料 从大杯倒入小杯
[email protected]:~$

模板方法模式中的角色和职责 

  AbstractClass(抽象类):在抽象类中定义了一系列基本操作

(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一

个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同

时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法

的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽

象类的子类中实现的基本方法,还可以调用其他对象中的方法。 

       ConcreteClass(具体子类): 它是抽象类的子类,用于实现在父类中声

明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现

的具体基本操作。 


模板方法的优缺点 

优点: 

       (1) 在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在

子类实现详细的处理算法时并不会改变算法中步骤的执行次序。 

       (2) 模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取

了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行

为,它鼓励我们恰当使用继承来实现代码复用。 

       (3) 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特

定步骤是否需要执行。 

       (4) 在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可

以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则

和开闭原则。 

缺点:

       需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本

方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象。


适用场景

  (1)具有统一的操作步骤或操作过程; 

 (2) 具有不同的操作细节; 

 (3) 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各

不相同;

   在抽象类中统一操作步骤,并规定好接口;让子类实现接口。这样

可以把各个具体的子类和操作步骤解耦合。 



时间: 2024-08-15 08:16:55

设计模式5 行为模式的相关文章

设计模式之单列模式

设计模式之单列模式 1,何为单列模式? 即singleton 在某个类采用了单列模式之后  其只能有一个实列对象 ,并且这个实列对象只能有内部自己创建并提供给外部的调用. 2.实现单列模式的方法 分为 :饿汉式 ,懒汉式 下面为饿汉式实现代码: public calss Singleton1{ //将构造函数私有化 防止外部通过new来创建对象 private Singleton1(){ } //创建一个私有静态变量并直接初始化 类加载的时候直接创建对象 private static Singl

设计模式09-组合模式

1. 概念 有时候又叫做部分-整体模式    存在整体和部分的时候  希望客户端忽略整体和部分的区别 2. 案例 /********************************************************************** * <pre> * FILE : Demo01.java * CLASS : Demo01 * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *=========================

设计模式13-代理模式

1. 概念 代理模式又称为委托模式 :为其他对象提供一种代理以控制对这个对象的访问. 2. 案例 package org.demo.proxy.demo01; public class Demo03 { public static void main(String[] args) { IUser user = new UserProxy(new UserImpl()) ; user.action() ; } } interface IUser{ void action() ; } class U

设计模式12-享元模式

1. 概念 享元模式(FlyWeight),运用共享技术有效的支持大量细粒度的对象 2. 案例 /********************************************************************** * <pre> * FILE : Demo01.java * CLASS : Demo01 * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *==================================

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

java设计模式之外观模式(门面模式)

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用. 二.角色及使用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用.这个模式中,设计到3个角色. 1).门面角色:外观模式的核心.它被客户角色调用,它熟悉子系统的功

【设计模式】迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象. 关键代码:定义接口:hasNext, next. 应用实例:JAVA 中的

【设计模式】过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准. 实现 我们将创建一个 Person 对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表.CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Pe

设计模式之组合模式

当需求中是体现部分与整体层次的结构时,以及你希望忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式了.例如:我们单个复制一个文件和多个复制文件,对我们而言,并不在乎一个文件的复制与多个文件复制的区别,也就是我们的操作是一样的. 下面的代码是建立一个公司的组织结构,其中各个部分,不管是分公司还是部门,都拥有一套相同的功能操作. 代码如下: using System; using System.Collections.Generic; using System.L