咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 384|回复: 0

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

[复制链接]
  • TA的每日心情
    无聊
    2019-5-27 08:20
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2022-1-1 10:33:46 | 显示全部楼层 |阅读模式
    目录

      概述
        模板模式生活案例策略模式涉及到两个角色UML
      总结示例


    概述

    模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤
    确定了步骤的执行顺序,单某些步骤因环境或人等因素具体实现是未知的

    模板模式生活案例

    请客吃饭【点菜->吃东西->结账】,每个人点菜不一样,吃东西不一样,结账也不一样从某地到某地【起点->出行方式->终点】起点和终点不一一样,但是每个人出行方式是不一样的
    Go没有封装、继承、多态这些概念,但同样通过别的方式可以实现这些特性
      封装:通过方法实现继承:通过匿名字段实现多态:通过接口实现

    策略模式涉及到两个角色

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

    UML


    Go语言基础模板设计模式示例详解-1.png


    总结

    优点:
      封装不变部分,扩展可变部分。提取公共代码,便于维护。行为由父类控制,子类实现。
    缺点:
    每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大
    使用场景:
    有多个子类共有的方法,且逻辑相同
    重要的、复杂的方法,可以考虑作为模板方法

    示例
    1. package main
    2. import "fmt"
    3. /*出行方式接口*/
    4. type Itravel interface {
    5.         Starting() //起点
    6.         Travel()   //出行方式
    7.         End()      //终点
    8. }
    9. //定义父类
    10. type Persion struct {
    11.         Name    string //姓名
    12.         Itravel Itravel  //出行方式接口
    13. }
    14. func (persion *Persion) SetName(name string) {
    15.         persion.Name = name
    16. }
    17. func (persion Persion) Starting() {
    18.         persion.Itravel.Starting()
    19. }
    20. func (persion Persion) Travel() {
    21.         persion.Itravel.Travel()
    22. }
    23. func (persion Persion) End() {
    24.         persion.Itravel.End()
    25. }
    26. //算法骨架
    27. func (persion Persion) Start() {
    28.         if persion.Itravel == nil {
    29.                 fmt.Println("Itravel is nil")
    30.                 return
    31.         }
    32.         fmt.Printf("%s", persion.Name)       
    33.         persion.Starting()
    34.         persion.Travel()
    35.         persion.End()
    36.         fmt.Println("\n")
    37. }
    38. //具体类:张三
    39. type ZhangSan struct {
    40.         Persion //匿名字段实现继承
    41. }
    42. func NewZhangSan() *ZhangSan {
    43.         c := new(ZhangSan)
    44.         c.Persion = Persion{Itravel: c}
    45.         return c
    46. }
    47. func (_ ZhangSan) Starting() {
    48.         fmt.Printf("从%s出发", "北京")
    49. }
    50. func (_ ZhangSan) Travel() {
    51.         fmt.Printf(" %s", "火车")
    52. }
    53. func (_ ZhangSan) End() {
    54.         fmt.Printf(" %s", "到达上海")
    55. }
    56. //具体类:李四
    57. type LiSi struct {
    58.         Persion
    59. }
    60. func (_ LiSi) Starting() {
    61.         fmt.Printf("从%s出发", "广州")
    62. }
    63. func (_ LiSi) Travel() {
    64.         fmt.Printf(" %s", "坐飞机")
    65. }
    66. func (_ LiSi) End() {
    67.         fmt.Printf(" %s", "到达重庆")
    68. }
    69. func main() {
    70.         //张三
    71.         zhangsan := NewZhangSan()
    72.         zhangsan.SetName("张三")
    73.         zhangsan.Start()
    74.         persion := &Persion{}
    75.         persion.SetName("张三")
    76.         persion.Itravel = ZhangSan{}
    77.         persion.Start()
    78.         //李四
    79.         persion.SetName("李四")
    80.         persion.Itravel = &LiSi{}
    81.         persion.Start()
    82.         lisi := LiSi{}
    83.         lisi.Itravel = lisi
    84.         lisi.SetName("李四")
    85.         lisi.Start()
    86. }
    复制代码
    以上就是Go语言基础模板设计模式示例详解的详细内容,更多关于Go语言模板设计模式的资料请关注咔叽论坛其它相关文章!

    原文地址:https://www.jb51.net/article/229387.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-29 08:53

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表