Go语言基础设计模式之策略模式示例详解
作者:枫少文 发布时间:2024-05-25 15:11:01
标签:Go语言,设计模式,策略模式
目录
概述
针对同一类型问题的多种处理方式
一、不使用策略模式
二、策略模式
UML
总结
示例
概述
定义一系列算法,将每个算法封装起来。并让它们能够相互替换。策略模式让算法独立于使用它的客户而变化。
针对同一类型问题的多种处理方式
一、不使用策略模式
package main
import "fmt"
type User struct {
Name string
}
func (this User) travel(t string) {
switch t {
case "飞机":
fmt.Printf("%s,飞机出行\n", this.Name)
case "火车":
fmt.Printf("%s,火车出行\n", this.Name)
case "走路":
fmt.Printf("%s,走路出行\n", this.Name)
default:
fmt.Println("你未选择了出行方式吗")
}
}
func main() {
User{"张三"}.travel("飞机")
User{"张三"}.travel("火车")
User{"张三"}.travel("走路")
User{"张三"}.travel("")
}
问题:
代码很多且复杂,if…else…多,不利于维护和扩展违反了"开闭原则",增加新的出行方式必须修改源码复用性差,无法单独重用其中的某个或某些算法
二、策略模式
生活策略模式例子:
张三从广东去北京【1.坐飞机,2.坐火车,3.走路】鹅厂推出了3种会员,分别为会员,超级会员、及金牌会员【皮肤不同,折扣不同】诸葛亮的锦囊妙计
策略模式涉及到三个角色:
编号 | 角色 | 描述 |
---|---|---|
1 | 环境(Context)角色 | 持有一个Strategy的引用 |
2 | 抽象策略(Strategy)角色 | 这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口 |
3 | 具体策略(ConcreteStrategy)角色 | 包装了相关的算法或行为。 |
UML
示例
package main
import "fmt"
/*出行方式*/
type Itravel interface {
Travel()
}
/*飞机*/
type Aircraft struct{}
/*火车*/
type Train struct{}
/*走路*/
type Walk struct{}
/*具体策略类 1:飞机出行*/
func (this Aircraft) Travel() {
fmt.Println("飞机出行")
}
/*具体策略类 2:火车出行*/
func (this Train) Travel() {
fmt.Println("火车出行")
}
/*具体策略类 3:走路出行*/
func (this Walk) Travel() {
fmt.Println("走路出行")
}
/*环境类*/
type User struct {
Name string
Itravel Itravel
}
func (this User) travel() {
fmt.Printf("%s", this.Name)
this.Itravel.Travel()
}
func main() {
user := User{"张三", Aircraft{}}
user.travel()
user = User{"李四", new(Train)}
user.travel()
user = User{"王五", &Walk{}}
user.travel()
}
来源:https://blog.csdn.net/guofeng93/article/details/91590838


猜你喜欢
- DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear
- 教程使用的版本是2019.1新版本安装激活可以参考此篇教程,通用版!一、go安装1、建议去go语言中文网下载,网址:https://stud
- 在处理数据时,经常需要对数据分组计算均值或者计数,在Microsoft Excel中,可以通过透视表轻易实现简单的分组运算。而对于更加复杂的
- 导读我们在使用selenium打开google浏览器的时候,默认打开的是一个新的浏览器窗口,而且里面不带有任何的浏览器缓存信息。当我们想要爬
- rs.open sql,conn,A,B A: ADOPenforwardonly (=0) 只读,且当前数据记录只能向下移动。 ADOPe
- Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储
- 在pycharm中,可以通过venv来建立工程,运行等等。但是一旦把这个工程文件夹拿到其他地方运行,而且不是在venv环境中运行,就有可能遇
- 需求场景,五百个文件里面,选取50个指定文件,放入新的文件夹里。1、准备工作1 安装python环境可能会报错,并且pip install
- 简介这是实验室2018年底招新时的考核题目,使用Python编写一个能够完成基本对战的五子棋游戏。面向新手。程序主要包括两个部分,图形创建与
- 脚本语言的第一行的目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它。写法:#!/usr/bin/python是告诉操作系统执
- 如何修改NT的登录密码? 代码见下:<%Sub ChangeUserPassword(C
- 前提:升序数组,待查元素在数组中。二分查找:就是一个递归函数c。待查元素a,当前数组中位数b,如果b=a则返回b的索引,b>a则在b左
- 如何使用migrations的使用非常简单: 修改model, 比如增加field, 然后运行python manager.py makem
- 前言:python利用matplotlib库中的plt.ion()函数实现即时数据动态显示:1.非定长的时间轴代码示例:# -*- codi
- 在python-numpy使用中,可以用双层 for循环对数组元素进行访问,也可以切片成每一行后进行一维数组的遍历。代码如下:import
- 1)在service层和mapper层中写一个插入方法和查询方法;我们先写一个日志类;定义属性;并且要在数据库中建好表;package en
- python是一种美丽的语言 ,应用范围也很广,有很多的人开始学习python开发,对于初学者,这里有5本经典的书籍,如果你打算用看书来学习
- Python os.remove() 方法os.remove() 方法用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError
- 本文实例讲述了javascript insertAfter()定义与用法。分享给大家供大家参考,具体如下:HTML部分:<div id
- 前言虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Req