设计模式案例(二)

系列文章目录

第一章 设计模式案例 (一)
第一章 设计模式案例 (二)


文章目录

  • 系列文章目录
  • 前言
  • 一、责任链模式
    • case 包
  • 二、策略模式
    • case 包
  • 三、工厂模式
    • case 包


前言

上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解,此文章主要讲解设计模式的案例。


一、责任链模式

case 包

代码如下(示例):

package _case
import "fmt"
func DutyCase() {pm := &ProjectManager{}dm := &DepartmentManager{}gm := &GeneralManager{}pm.SetNext(dm).SetNext(gm)pm.Handle("张三", 300)pm.Handle("李四", 800)pm.Handle("王五", 1800)
}
type Handler interface {SetNext(h Handler) HandlerHandle(user string, amount int64)
}
// 项目经理
type ProjectManager struct {next Handler
}
func (pm *ProjectManager) Handle(user string, amount int64) {if amount <= 500 {fmt.Printf("%s 申请聚餐费用 %d 元,项目经理审批通过\n", user, amount)return}// 项目经理没有权限,交给下一个人处理pm.next.Handle(user, amount)
}
func (pm *ProjectManager) SetNext(h Handler) Handler {pm.next = hreturn h
}
// 部门经理
type DepartmentManager struct {next Handler
}
func (dm *DepartmentManager) Handle(user string, amount int64) {if amount > 500 && amount <= 1000 {fmt.Printf("%s 申请聚餐费用 %d 元,部门经理审批通过\n", user, amount)return} else if amount > 1000 {fmt.Printf("%s 申请聚餐费用 %d 元,部门经理审批通过,总经理加签\n", user, amount)dm.next.Handle(user, amount)} else {dm.next.Handle(user, amount)}
}
func (dm *DepartmentManager) SetNext(h Handler) Handler {dm.next = hreturn h
}
// 总经理
type GeneralManager struct {next Handler
}
func (gm *GeneralManager) Handle(user string, amount int64) {if amount > 1000 {fmt.Printf("%s 申请聚餐费用 %d 元,总经理审批通过\n", user, amount)return}gm.next.Handle(user, amount)
}
func (gm *GeneralManager) SetNext(h Handler) Handler {gm.next = hreturn h
}

代码如下(示例):main

package main
import _case "design-pattern/duty/case"
func main() {_case.DutyCase()
}

二、策略模式

case 包

代码如下(示例):

package _caseimport "fmt"func StrategyCase() {arr := []int{1, 3, 8, 2, 4, 5}arr1 := []int{5, 2, 4, 6, 9, 8}ctx := &Context{}//设置排序策略- 冒泡算法ctx.SetStrategy(&bubble{})ctx.ExecuteStrategy(arr)fmt.Println(arr)//设置排序策略-选择策略ctx.SetStrategy(&selection{})ctx.ExecuteStrategy(arr1)fmt.Println(arr1)
}// 排序策略定义
type SortStrategy interface {Sort(arr []int)
}// 冒泡排序
type bubble struct{}func (*bubble) Sort(arr []int) {fmt.Println("冒泡算法")n := len(arr)for i := 0; i < n-1; i++ {flag := falsefor j := 0; j < n-1-i; j++ {if arr[j] > arr[j+1] {arr[j], arr[j+1] = arr[j+1], arr[j]flag = true}}if !flag {break}}
}// 选择排序
type selection struct{}func (*selection) Sort(arr []int) {fmt.Println("选择排序")size := len(arr)for i := 0; i < size-1; i++ {minIndex := ifor j := i + 1; j < size; j++ {if arr[j] < arr[minIndex] {minIndex = j}}if minIndex != i {arr[i], arr[minIndex] = arr[minIndex], arr[i]}}
}type Context struct {stratety SortStrategy
}func (ctx *Context) SetStrategy(s SortStrategy) {ctx.stratety = s
}func (ctx *Context) ExecuteStrategy(arr []int) {ctx.stratety.Sort(arr)
}

代码如下(示例):main

package mainimport _case "design-pattern/trategy/case"func main() {_case.StrategyCase()
}
}

三、工厂模式

case 包

代码如下(示例):简单工厂


package _case
type Product interface {GetName() string
}
type ProductA struct {name string
}
func (a *ProductA) GetName() string {return a.name
}
type ProductB struct {name string
}
func (b *ProductB) GetName() string {return b.name
}
type ProductC struct {name string
}
func (c *ProductC) GetName() string {return c.name
}

package _case
import ("fmt"
)
type SimpleFactory struct {
}
func (f *SimpleFactory) CreateProduct(productType string) Product {switch productType {case "A":return &ProductA{name: "product A",}case "B":return &ProductB{name: "product B",}case "C":return &ProductC{name: "product C",}}return nil
}
func SimpleFactoryCase() {factory := &SimpleFactory{}var product Productproduct = factory.CreateProduct("A")fmt.Println(product.GetName())product = factory.CreateProduct("B")fmt.Println(product.GetName())product = factory.CreateProduct("C")if product != nil {fmt.Println(product.GetName())}
}

代码如下(示例):简单工厂


package _case
type Product interface {GetName() string
}
type ProductA struct {name string
}
func (a *ProductA) GetName() string {return a.name
}
type ProductB struct {name string
}
func (b *ProductB) GetName() string {return b.name
}
type ProductC struct {name string
}
func (c *ProductC) GetName() string {return c.name
}
package _case
import "fmt"
type Factory interface {CreateProduct() Product
}
type FactoryA struct {
}
func (f *FactoryA) CreateProduct() Product {return &ProductA{name: "product A",}
}
type FactoryB struct {
}
func (f *FactoryB) CreateProduct() Product {return &ProductB{name: "product B",}
}
type FactoryC struct {
}
func (f *FactoryC) CreateProduct() Product {return &ProductC{name: "product C",}
}
func FactoryMethodCase() {var factory Factoryvar product Productfactory = &FactoryA{}product = factory.CreateProduct()fmt.Println(product.GetName())factory = &FactoryB{}product = factory.CreateProduct()fmt.Println(product.GetName())factory = &FactoryC{}product = factory.CreateProduct()fmt.Println(product.GetName())
}

代码如下(示例):main

package main
import _case "design-pattern/factory/case"
func main() {//_case.SimpleFactoryCase()_case.FactoryMethodCase()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ida81输入密码验证算法分析以及破解思路

本文分析了ida81对输入密码的验证流程&#xff0c;分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析&#xff0c;并尝试找一些可利用的破绽。很遗憾&#xff0c;由于水平有限&#xff0c;目前也只是有个思路未能完全实现&#xff0c…

【C++】单例模式【两种实现方式】

目录 一、了解单例模式前的基础题 1、设计一个类&#xff0c;不能被拷贝 2、设计一个类&#xff0c;只能在堆上创建对象 3、设计一个类&#xff0c;只能在栈上创建对象 4、设计一个类&#xff0c;不能被继承 二、单例模式 1、单例模式的概念 2、单例模式的两种实现方式 …

20231112_DNS详解

DNS是实现域名与IP地址的映射。 1.映射图2.DNS查找顺序图3.DNS分类和地址4.如何清除缓存 1.映射图 图片来源于http://egonlin.com/。林海峰老师课件 2.DNS查找顺序图 3.DNS分类和地址 4.如何清除缓存

CV学习基础

脸部检测是基于图像的明暗变化模式进行判断&#xff0c;需要将图像先进行灰度化处理 马赛克处理需先将图像缩小然后夸大回原尺寸。 保存训练好的算法用joblib 进行以下操作时已经使用cv2.cvtColor()完成了灰度化 图像平滑化&#xff08;模糊处理&#xff09;&#xff1a;cv…

工业摄像机参数计算

在工业相机选型的时候有点懵&#xff0c;有一些参数都不知道咋计算的。有些概念也没有区分清楚。‘’ 靶面尺寸 CMOS 或者是 CCD 使用几分之几英寸来标注的时候&#xff0c;这个几分之几英寸计算的是什么尺寸&#xff1f; 一开始我以为这个计算的就是靶面的实际对角线的尺寸…

ASP.NETWeb开发(C#版)-day1-C#基础+实操

目录 .NET实操&#xff1a;创建项目执行 C#基础语法数据类型变量实操001_变量如何在一个解决方案 中创建另一个项目实操002结构实操003-if else实操004-多分支多行注释按钮实操&#xff1a;循环 面向对象基础如何在同一个项目下创建新的.cs文件实操-类的定义与访问实操-练习实操…

知乎日报第四周总结

这周基本完成了知乎日报的内容&#xff0c;主要写了点赞收藏的滑动刷新的保存&#xff0c;还有收藏文章的功能&#xff0c;主要用到FMDB库。 对于如何使用FMDB库 同样需要用cocopads引入FMDB库,使用时需要引入头文件 #import "FMDatabase.h"FMDB库的使用类似于C语…

Qt 自定义按钮 区分点按与长按信号,适配触摸事件

Qt 自定义按钮 区分点按与长按信号 适配触摸事件 效果 使用示例 // 点按connect(ui.btnLeft, &JogButton::stepclicked, this, &MainWindow::btnLeft_clicked);// 长按开始connect(ui.btnLeft, &JogButton::continueOn, this, &MainWindow::slotJogLeftOn);//…

Clickhouse学习笔记(11)—— 数据一致性

使用合并树引擎时&#xff0c;无论是ReplacingMergeTree还是SummingMergeTree&#xff0c;都只能保证数据的最终一致性&#xff0c;因为数据的去重、聚合等操作会在数据合并的期间进行&#xff0c;而合并会在后台以一个不确定的时间进行&#xff0c;因此无法预先计划&#xff1…

c语言:用指针解决有关字符串等问题

题目1&#xff1a;将一个字符串str的内容颠倒过来&#xff0c;并输出。 数据范围&#xff1a;1≤len(str)≤10000 代码和思路&#xff1a; #include <stdio.h> #include<string.h> int main() {char str1[10000];gets(str1);//读取字符串内容char* p&str1[…

有源RS低通滤波

常用的滤波电路有无源滤波和有源滤波两大类。若滤波电路元件仅由无源元件&#xff08;电阻、电容、电感&#xff09;组成&#xff0c;则称为无源滤波电路。无源滤波的主要形式有电容滤波、电感滤波和复式滤波(包括倒L型、LC滤波、LCπ型滤波和RCπ型滤波等)。若滤波电路不仅有无…

从0开始python学习-32.pytest.mark()

目录 1. 用户自定义标记 1.1 注册标记​编辑 1.2 给测试用例打标记​编辑 1.3 运行标记的测试用例 1.4 运行多个标记的测试用例 1.5 运行指定标记以外的所有测试用例 2. 内置标签 2.1 skip &#xff1a;无条件跳过&#xff08;可使用在方法&#xff0c;类&#xff0c;模…

[vuex] unknown mutation type: SET_SOURCE

项目中使用了vuex&#xff0c;并且以模块的形式分好之后。在调用的时候出现了以上问题 /*当我们commit的时候要注意要加上模块的名字 user是模块名称&#xff0c;SET_SOURCE是user模块中定义的方法 正确写法&#xff1a;*/ this.$store.commit("user/SET_SOURCE", th…

火爆进行中的抖音双11好物节,巨量引擎助5大行业商家开启爆单之路!

抖音双11好物节目前正在火热进行中&#xff0c;进入爆发期&#xff0c;各大商家“好招”频出&#xff0c;都想要实现高速增长。依托“人群、货品、流量”三大优势&#xff0c;巨量引擎一直都是商家生意增长的给力伙伴&#xff0c;在今年的抖音双11好物节&#xff0c;巨量引擎就…

Vue3 源码解读系列(二)——初始化应用实例

初始化应用实例 创建 Vue 实例对象 createApp 中做了两件事&#xff1a; 创建 app 对象保存并重写 mount /*** 创建 Vue 实例对象*/ const createApp ((...args) > {// 1、创建 app 对象&#xff0c;延时创建渲染器&#xff0c;优点是当用户只依赖响应式包的时候&#xff0…

网络的分类和特点

对于计算机网络&#xff0c;按照不同的标准有不同的分类方法。 ▶1.按计算机的物理连接方式分类 计算机连接的物理方式决定了网络的拓扑结构。按网络的拓扑结构可以分为星形拓扑网络、环形拓扑网络、总线型拓扑网络、网状拓扑网络等。 1)星形拓扑 星形拓扑的网络以一台中央…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息&#xff0c;这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题&#xff1a; 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

【毕业论文】基于python爬虫对豆瓣影评分析系统的设计与实现

题目 基于python爬虫对豆瓣影评分析系统的设计与实现 Design and Implementation of a Python-based Web Crawler for Analyzing Douban Movie Reviews 目录 目录 2 摘要 3 关键词 3 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 1.3 国内外研究现状 6 1.4 研究内容和…

华为ensp:vrrp双机热备负载均衡

现在接口ip都已经配置完了&#xff0c;直接去配置vrrp r1上192.168.1.100 作为主 192.168.2.100作为副 r2上192.168.1.199 作为副 192.168.2.100作为主 这样就实现了负载均衡&#xff0c;如果两个都正常运行时&#xff0c;r1作为1.1的网关&#xff0c;r2作为2.1网关…

Vue3+NodeJS 接入文心一言, 发布一个 VSCode 大模型问答插件

目录 一&#xff1a;首先明确插件开发方式 二&#xff1a;新建一个Vscode 插件项目 1. 官网教程地址 2. 一步一步来创建 3. 分析目录结构以及运行插件 三&#xff1a;新建一个Vue3 项目&#xff0c;在侧边栏中展示&#xff0c;实现vscode插件 <> vue项目 双向消息传…