通过手机案例理解Go设计模式之装饰器模式的功能属性

 更新时间:2023年05月19日 11:56:12   作者:liquanhui_99  
这篇文章主要为大家介绍了Go设计模式之装饰器模式的功能属性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

装饰器模式

装饰器模式也被称为包装器模式,指的是在不改变原有对象属性和方法的基础上,动态的给原有对象添加一些新的功能和属性。

具体案例代码如下:

基础手机的需求

先定义一个公用的interface Phone,提供两个方法, 一个是设置手机的颜色,一个是获取手机的价格:

type Phone interface {
  SelectColor(color string) string
  GetPrice() int
}

定义一个基础版的手机对象,该对象有尺寸、颜色、价格、内存、像素基础字段,该对象实现Phone接口。

type BasePhone struct {
  Size   int
  Price  int
  Color  string
  Memory int
  Pixel  int
}
func (p *BasePhone) SelectColor(color string) string {
  p.Color = color
  return color
}
func (p *BasePhone) GetPrice() int {
  return p.Price
}

上一步已经实现基础手机的需求,但是手机售卖会有不同的系列,拍照手机广受年轻人的喜爱,所以需要推出一个拍照手机系列,拍照手机具备基础版手机的功能,需要在此基础上新增手机像素的方法,调整基础像素,实现价格和颜色方法,那么就需要组合BasePhone。

type CameraPhone struct {
  BasePhone BasePhone
}
func (c *CameraPhone) SelectColor(color string) string {
  return c.BasePhone.SelectColor(color)
}
func (c *CameraPhone) GetPrice() int {
  return c.BasePhone.GetPrice() + CM
}
func (c *CameraPhone) GetPixel() int {
  c.BasePhone.Pixel += 50000000
  return c.BasePhone.Pixel
}

同样的,除了拍照手机系列,还有一个plus版本,这个版本比基础版本多了128G内存,所以需要单独实现一个调整内存的方法。

调整内存的方法

type PhonePlus struct {
  BasePhone BasePhone
}
func (p *PhonePlus) SelectColor(color string) string {
  p.BasePhone.SelectColor(color)
  return p.BasePhone.Color
}
func (p *PhonePlus) GetPrice() int {
  return p.BasePhone.GetPrice() + MP
}
func (p *PhonePlus) GetMemory() int {
  return p.BasePhone.Memory + 128*1024
}

接着推出一款plusplus加强版,这个版本像素和拍照版本一致,都是1亿像素,内存比plus版本又多了128G,这个版本以plus版为基础实现,需要实现设置颜色、获取价格、获取像素、获取内存的方法。

type PhonePlusPlus struct {
  PhonePlus PhonePlus
}
func (p *PhonePlusPlus) SelectColor(color string) string {
  return p.PhonePlus.SelectColor(color)
}
func (p *PhonePlusPlus) GetPrice() int {
  return p.PhonePlus.GetPrice() + MP
}
func (p *PhonePlusPlus) GetPixel() int {
  return p.PhonePlus.BasePhone.Pixel + 50000000
}
func (p *PhonePlusPlus) GetMemory() int {
  return p.PhonePlus.GetMemory() + 128*1024
}

运行程序

最后,运行下程序看看结果

package main
import "fmt"
func main() {
  basePhone := BasePhone{
      Size:   1000,
      Color:  "red",
      Price:  1000,
      Memory: 128 * 1024,
      Pixel:  50000000,
  }
  fmt.Printf("基础版的价格: %d, 颜色: %s, 像素为:%d, 内存为: %d\n", basePhone.GetPrice(), basePhone.SelectColor("纯黑"), basePhone.Pixel, basePhone.Memory)
  camaraPhone := CameraPhone{
      BasePhone: basePhone,
  }
  fmt.Printf("拍照版的价格: %d, 颜色: %s, 像素为:%d, 内存为: %d\n", camaraPhone.GetPrice(), camaraPhone.SelectColor("宝石蓝"), camaraPhone.GetPixel(), camaraPhone.BasePhone.Memory)
  phonePlus := PhonePlus{
      BasePhone: basePhone,
  }
  fmt.Printf("plus版的价格: %d, 颜色: %s, 像素为:%d, 内存为: %d\n", phonePlus.GetPrice(), phonePlus.SelectColor("玫瑰金"), phonePlus.BasePhone.Pixel, phonePlus.GetMemory())
  phonePlusPlus := PhonePlusPlus{
      PhonePlus: phonePlus,
  }
  fmt.Printf("plus Plus版的价格: %d, 颜色: %s, 像素为:%d, 内存为: %d\n", phonePlusPlus.GetPrice(), phonePlusPlus.SelectColor("青山黛"), phonePlusPlus.GetPixel(), phonePlusPlus.GetMemory())
}

结果:

基础版的价格: 1000, 颜色: 纯黑, 像素为:50000000, 内存为: 131072
拍照版的价格: 1600, 颜色: 宝石蓝, 像素为:100000000, 内存为: 131072     
plus版的价格: 1500, 颜色: 玫瑰金, 像素为:50000000, 内存为: 262144      
plus Plus版的价格: 2000, 颜色: 青山黛, 像素为:100000000, 内存为: 393216

上述结果可以看出,程序已经实现了所有的需求。

以上就是Go设计模式之装饰器模式的详细内容,更多关于Go设计模式之装饰器模式的资料请关注脚本之家其它相关文章!

相关文章

  • golang time包的用法详解

    golang time包的用法详解

    这篇文章主要介绍了golang time包的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Go语言实现的简单网络端口扫描方法

    Go语言实现的简单网络端口扫描方法

    这篇文章主要介绍了Go语言实现的简单网络端口扫描方法,实例分析了Go语言网络程序的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 深入解析Golang中JSON的编码与解码

    深入解析Golang中JSON的编码与解码

    随着互联网的快速发展和数据交换的广泛应用,各种数据格式的处理成为软件开发中的关键问题,本文将介绍 Golang 中 JSON 编码与解码的相关知识,帮助大家了解其基本原理和高效应用,需要的可以收藏一下
    2023-05-05
  • GoLang中生成UUID唯一标识的实现

    GoLang中生成UUID唯一标识的实现

    这篇文章主要介绍了GoLang中生成UUID唯一标识的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang实现openssl自签名双向认证的详细步骤

    golang实现openssl自签名双向认证的详细步骤

    这篇文章主要介绍了golang实现openssl自签名双向认证的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • Go语言数据类型详细介绍

    Go语言数据类型详细介绍

    这篇文章主要介绍了Go语言数据类型详细介绍,Go语言数据类型包含基础类型和复合类型两大类,下文关于这两类型的相关介绍,需要的小伙伴可以参考一下
    2022-03-03
  • 在goland中读取tpl文件的图文操作

    在goland中读取tpl文件的图文操作

    这篇文章主要介绍了在goland中读取tpl文件的图文操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang抓取网页并分析页面包含的链接方法

    golang抓取网页并分析页面包含的链接方法

    今天小编就为大家分享一篇golang抓取网页并分析页面包含的链接方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 源码分析Go语言中gofmt实现原理

    源码分析Go语言中gofmt实现原理

    gofmt 是 Go 语言官方提供的一个工具,用于自动格式化 Go 源代码,使其符合 Go 语言的官方编码风格,本文给大家源码详细分析了Go语言中gofmt实现原理,并通过图文和代码讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • Go Plugins插件的实现方式

    Go Plugins插件的实现方式

    目前 Plugins 仅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 调用,今天通过本文给大家介绍Go Plugins插件的实现方式,感兴趣的朋友一起看看吧
    2021-08-08

最新评论