当前位置: 首页 > news >正文

设计模式——模板模式

设计模式——模板模式

  1. 设计模式分为创建型、结构型、行为型三大类。
  2. 创建型设计模式主要解决“对象的创建”问题
    1. 比较常用的有单例模式和工厂模式,相关链接如下:
    2. 设计模式——单例模式
    3. 设计模式——工厂模式
  3. 结构型设计模式主要解决“类或对象的组合”问题
    1. 比较常用的有代理模式,装饰器模式,相关链接如下:
    2. 设计模式——代理模式
    3. 设计模式——装饰器模式
  4. 行为型设计模式主要解决的就是“类或对象之间的交互”问题
    1. 比较常用的有观察者模式,策略模式,模板模式
    2. 设计模式——观察者模式
    3. 设计模式——策略模式
    4. 设计模式——模板模式

目录

  1. 模式定义和使用场景
  2. 模式结构
  3. 模板模式优点?
  4. 模板模式缺点?
  5. 模板模式代码实现

1. 模式定义和使用场景

  1. 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构就可以重定义该算法的某些特定步骤。
  2. 主要解决一些方法通用,却在每一个子类都重新写了这一方法的场景。
  3. 使用场景:比如冲咖啡和冲茶叶,整体过程是相同的,但细节不同。
  4. 煮水 1. 煮水
  5. 冲泡咖啡 2. 冲泡茶叶
  6. 倒入杯中 3. 倒入杯中
  7. 加糖和牛奶 4. 加柠檬

2. 模式结构

  1. 策略模式包含如下角色:
    a. Game: 抽象类,定义了算法的骨架
    b. Cricket和Football:具体模板类
    在这里插入图片描述

3. 模板模式优点?

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。

4. 模板模式缺点?

  1. 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

5. 模板模式代码实现

1. C++代码实现

#include <iostream>
#include <vector>

using namespace std;

class DrinkTemplate {
public:
    virtual void BoildWater() = 0; //煮水
    virtual void Brew() = 0; //冲泡
    virtual void PourInCup() = 0; //倒入杯中
    virtual void AddSomeThing() = 0; //加辅助料

    void Make() { //模板方法
        BoildWater();
        Brew();
        PourInCup();
        AddSomeThing();
    }
};

class Coffee : public DrinkTemplate {
public:
    void BoildWater() {
        cout << "煮山泉水" << endl;
    }

    void Brew() {
        cout << "冲泡咖啡" << endl;
    }

    void PourInCup() {
        cout << "咖啡倒入杯中" << endl;

    }

    void AddSomeThing() {
        cout << "加糖,加奶..." << endl;
    }
};

//煮茶
class Tea : public DrinkTemplate {
public:
    void BoildWater() {
        cout << "煮山泉水" << endl;
    }

    void Brew() {
        cout << "冲泡茶叶" << endl;

    }

    void PourInCup() {
        cout << "茶水倒入杯中" << endl;
    }

    void AddSomeThing() {
        cout << "加柠檬..." << endl;
    }

};

int main() {
    DrinkTemplate *coffee = new Coffee();
    coffee->Make();

    DrinkTemplate *tea = new Tea();
    tea->Make();

    delete coffee;
    coffee = nullptr;
    cout << "-----------------" << endl;
    delete tea;
    tea = nullptr;

    return 0;
}

煮山泉水
冲泡咖啡
咖啡倒入杯中
加糖,加奶...
-----------------
煮山泉水
冲泡茶叶
茶水倒入杯中
加柠檬...

2. Go代码实现

package main

import "fmt"

type DrinkImpl interface {
	BoilWater()
	Brew()
	PourInCup()
	AddSomeThing()
}

type MakeDrinkTemplate struct {
	drink DrinkImpl
}

func (m *MakeDrinkTemplate) MakeDrink() {
	m.drink.BoilWater()
	m.drink.Brew()
	m.drink.PourInCup()
	m.drink.AddSomeThing()
}

type Coffer struct {
}

func (c *Coffer) BoilWater() {
	fmt.Println("煮山泉水")
}

func (c *Coffer) Brew() {
	fmt.Println("冲泡咖啡")
}

func (c *Coffer) PourInCup() {
	fmt.Println("咖啡倒入杯中")
}

func (c *Coffer) AddSomeThing() {
	fmt.Println("加糖,加奶...")
}

type Tea struct {
}

func (t *Tea) BoilWater() {
	fmt.Println("煮山泉水")
}

func (t *Tea) Brew() {
	fmt.Println("冲泡茶叶")
}

func (t *Tea) PourInCup() {
	fmt.Println("茶叶倒入杯中")
}

func (t *Tea) AddSomeThing() {
	fmt.Println("加柠檬...")
}

func main() {
	m1 := &MakeDrinkTemplate{
		drink: new(Coffer),
	}
	m1.MakeDrink()
	fmt.Println("-----------------")

	m2 := &MakeDrinkTemplate{
		drink: new(Tea),
	}
	m2.MakeDrink()
}

煮山泉水
冲泡咖啡
咖啡倒入杯中
加糖,加奶...
-----------------
煮山泉水
冲泡茶叶
茶叶倒入杯中
加柠檬...

相关文章:

  • 倍投技巧 - 凯利公式教你如何用正确的方法投资
  • SpringBoot restful api接口设计
  • 软件测试高薪“骗局”软件测试入门就月薪过万,还包就业。别再上当受骗了、清醒点吧
  • 【DP 动态规划 | 精选推荐】持续更新
  • 专利的要求-需要什么条件?
  • Google Earth Engine (GEE)——GEE制作gif动态图(北京市为例)
  • Spring-Framework-ioc-1
  • Vue 动态换肤
  • 从零到一搭建基础架构-玩转maven依赖版本管理
  • CE修改器学习历程之下载、安装和汉化
  • 【鸟哥杂谈】物联网体系知识梳理
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • C语言必刷题——期末不挂科
  • 基于微信小程序+SSM+Vue+Node实现智慧旅游商城系统
  • RabbitMQ常用消息模式
  • 4个实用的微服务测试策略
  • Angular数据绑定机制
  •  D - 粉碎叛乱F - 其他起义
  • k8s如何管理Pod
  • vue:响应原理
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端学习笔记之观察者模式
  • 如何胜任知名企业的商业数据分析师?
  • 试着探索高并发下的系统架构面貌
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 一个SAP顾问在美国的这些年
  • - 转 Ext2.0 form使用实例
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​iOS安全加固方法及实现
  • (10)STL算法之搜索(二) 二分查找
  • (k8s中)docker netty OOM问题记录
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (三分钟)速览传统边缘检测算子
  • (一)u-boot-nand.bin的下载
  • (转)scrum常见工具列表
  • *p++,*(p++),*++p,(*p)++区别?
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bashrc在哪里,alias妙用
  • .Net Core与存储过程(一)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 服务 ServiceController
  • .Net下的签名与混淆
  • .net中调用windows performance记录性能信息
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @test注解_Spring 自定义注解你了解过吗?
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [20150629]简单的加密连接.txt
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [Foreman]解决Unable to find internal system admin account
  • [HNOI2010]BUS 公交线路