Go语言基础模板设计模式示例详解

作者:package main 时间:2024-02-01 16:29:32 

目录
  • 概述

    • 模板模式生活案例

    • 策略模式涉及到两个角色

    • UML

  • 总结

    • 示例

      概述

      模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤

      确定了步骤的执行顺序,单某些步骤因环境或人等因素具体实现是未知的

      模板模式生活案例

      请客吃饭【点菜->吃东西->结账】,每个人点菜不一样,吃东西不一样,结账也不一样从某地到某地【起点->出行方式->终点】起点和终点不一一样,但是每个人出行方式是不一样的

      Go没有封装、继承、多态这些概念,但同样通过别的方式可以实现这些特性

      • 封装:通过方法实现

      • 继承:通过匿名字段实现

      • 多态:通过接口实现

      策略模式涉及到两个角色

      编号角色描述
      1抽象父类(AbstractClass)实现了模板方法,定义了算法的骨架
      2具体类(ConcreteClass)实现抽象类中的抽象方法,即不同的对象的具体实现细节

      UML

      Go语言基础模板设计模式示例详解

      示例


      package main
      import "fmt"
      /*出行方式接口*/
      type Itravel interface {
      Starting() //起点
      Travel()   //出行方式
      End()      //终点
      }
      //定义父类
      type Persion struct {
      Name    string //姓名
      Itravel Itravel  //出行方式接口
      }
      func (persion *Persion) SetName(name string) {
      persion.Name = name
      }
      func (persion Persion) Starting() {
      persion.Itravel.Starting()
      }
      func (persion Persion) Travel() {
      persion.Itravel.Travel()
      }
      func (persion Persion) End() {
      persion.Itravel.End()
      }
      //算法骨架
      func (persion Persion) Start() {
      if persion.Itravel == nil {
      fmt.Println("Itravel is nil")
      return
      }
      fmt.Printf("%s", persion.Name)
      persion.Starting()
      persion.Travel()
      persion.End()
      fmt.Println("\n")
      }
      //具体类:张三
      type ZhangSan struct {
      Persion //匿名字段实现继承
      }
      func NewZhangSan() *ZhangSan {
      c := new(ZhangSan)
      c.Persion = Persion{Itravel: c}
      return c
      }
      func (_ ZhangSan) Starting() {
      fmt.Printf("从%s出发", "北京")
      }

      func (_ ZhangSan) Travel() {
      fmt.Printf(" %s", "火车")
      }
      func (_ ZhangSan) End() {
      fmt.Printf(" %s", "到达上海")
      }
      //具体类:李四
      type LiSi struct {
      Persion
      }
      func (_ LiSi) Starting() {
      fmt.Printf("从%s出发", "广州")
      }
      func (_ LiSi) Travel() {
      fmt.Printf(" %s", "坐飞机")
      }
      func (_ LiSi) End() {
      fmt.Printf(" %s", "到达重庆")
      }
      func main() {
      //张三
      zhangsan := NewZhangSan()
      zhangsan.SetName("张三")
      zhangsan.Start()
      persion := &Persion{}
      persion.SetName("张三")
      persion.Itravel = ZhangSan{}
      persion.Start()
      //李四
      persion.SetName("李四")
      persion.Itravel = &LiSi{}
      persion.Start()
      lisi := LiSi{}
      lisi.Itravel = lisi
      lisi.SetName("李四")
      lisi.Start()
      }

      来源:https://blog.csdn.net/guofeng93/article/details/92088592

      标签:Go语言,设计模式,模板模式
      0
      投稿

      猜你喜欢

    • Python库skimage绘制二值图像代码实例

      2023-06-12 15:05:33
    • 如何利用Python批量处理行、列和单元格详解

      2023-02-05 05:07:35
    • PHP7新特性foreach 修改示例介绍

      2024-06-05 09:23:48
    • Python 3.8正式发布,来尝鲜这些新特性吧

      2023-01-30 18:54:16
    • Python图像处理之图像金字塔的向上和向下取样

      2021-12-19 03:56:06
    • Javascript 回调和事件(翻译)

      2009-03-28 11:47:00
    • pip install urllib2不能安装的解决方法

      2022-05-27 12:25:13
    • 探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句

      2024-01-16 19:07:50
    • 基于jupyter代码无法在pycharm中运行的解决方法

      2023-09-15 06:46:38
    • python使用matplotlib绘制雷达图

      2022-10-10 16:37:41
    • 如何取得MYSQL中ENUM列的全部可能值

      2009-07-30 08:53:00
    • xmind2022下载非试用超详细图文教程

      2023-06-03 18:52:06
    • 按钮表状态还是表动作?

      2009-03-23 18:21:00
    • 轻量级的原生js日历插件calendar.js使用指南

      2024-04-17 09:44:39
    • Oracle数据库失效对象处理详情

      2023-07-13 16:42:39
    • python调用百度REST API实现语音识别

      2023-08-28 19:44:44
    • python列表中remove()函数的使用方法详解

      2021-05-13 22:52:46
    • python中copy()与deepcopy()的区别小结

      2022-02-22 19:39:14
    • JavaScript中call,apply,bind的区别与实现

      2024-04-22 12:51:26
    • flask-restful使用总结

      2023-02-10 13:24:21
    • asp之家 网络编程 m.aspxhome.com