首页 > 其他分享 >Golang的类图

Golang的类图

时间:2023-07-06 14:26:10浏览次数:43  
标签:string struct 类图 Weather Golang weather type Name

@

目录

1. 依赖(Dependency)

1.1 概念

类与类的链接,A依赖于B,B的变化引起A的变化。
go中表现为B是A的方法的参数。

1.2 代码示例

  • 定义两个结构体植物天气
  • 定义植物的方法生长,它需要参数天气
  • 实例化植物天气,调用植物的生长方法,将天气作为参数传入得到结果。
  • 我们可以看到:天气植物的依赖
package main

import "fmt"

type Plant struct {
	Leaves string
	Trunk  string
	Root   string
}

type Weather struct {
	Temperature int64
	Raining     bool
}

func (plant *Plant) Grow(weather *Weather) (result string) {
	if weather.Raining == true && weather.Temperature > 18 {
		return "植物生长了"
	}
	return "植物没有生长"
}

func main() {
	apple := Plant{
		Leaves: "阔叶",
	}
	weather := &Weather{
		Temperature: 20,
		Raining:     true,
	}

	fmt.Println(apple.Grow(weather))

}

输出

植物生长了

1.3 类图示例

上边的代码创建类图如下:

classDiagram Pland ..> Weather class Pland{ +String Leaves +String Trunk +String Root +Grow() } class Weather{ +Int64 Temperature +bool Raining }

2. 泛化(Generalization)-继承

2.1 概念

表现为类与类或接口与接口之间的继承关系。
go中表现为结构体的伪继承。

2.2 代码示例

  • 上例中,我们添加一个结构体水果,其中一个成员引用结构体植物
  • 实例化苹果和一个天气
  • 植物类的方法苹果依然可以实现
  • 我们可以看到:水果类伪继承了植物
package main

import "fmt"

type Plant struct {
	Leaves string
	Trunk  string
	Root   string
}

type Fruit struct {
	Name string
	Plant
}

type Weather struct {
	Temperature int64
	Raining     bool
}

func (plant *Plant) Grow(weather *Weather) (result string) {
	if weather.Raining == true && weather.Temperature > 18 {
		return "植物生长了"
	}
	return "植物没有生长"
}

func main() {
	apple := Fruit{
		Name: "苹果",
	}
	weather := &Weather{
		Temperature: 20,
		Raining:     true,
	}

	fmt.Println(apple.Grow(weather))

}

2.3 类图

classDiagram Pland <|-- Fruit class Pland{ +String Leaves +String Trunk +String Root +Grow() } class Fruit{ +String Name }

3. 泛化(Generalization)-实现

3.1 概念

表现为类对接口的实现

3.2 代码示例

  • 定义一个结构体植物
  • 定义一个植物类的方法生长
  • 定义一个变化接口,实现生长方法
  • 实例化苹果,实现变化接口。
  • 我们可以看到:类植物的实例化苹果,实现了变化接口
package main

import "fmt"

type Plant struct {
	Name string
}

type Weather struct {
	Temperature int64
	Raining     bool
}

func (plant *Plant) Grow(weather *Weather) (result string) {
	if weather.Raining == true && weather.Temperature > 18 {
		return "植物生长了"
	}
	return "植物没有生长"
}

type Change interface {
	Grow(weather *Weather) (result string)
}

func main() {
	plant := &Plant{
		Name: "orange",
	}
	weather := &Weather{
		Temperature: 20,
		Raining:     true,
	}
	result := Change(plant).Grow(weather)
	fmt.Println(result)

}

3.3 类图

classDiagram Pland --|> Change class Pland{ +String Name +Grow() } class Change{ <<interface>> +Crow() }

4. 关联关系(Association)

4.1 概念

表现为变量

  • 单向关联
    只有一个类知道另外一个类的公共属性和操作
  • 双向关联
    两个类都知道另一个类的公共属性和操作

4.2 代码示例

  • 植物结构体中关联了天气
  • 植物定义一个生长方法,改方法将天气作为变量:当温度>20 且下雨的时候植物生长
  • 实例化一个“植物”——“苹果”,实例化一个天气
  • 第一天,根据天气判断植物生长
  • 第二天,天气变化,再次判断植物生长
package main

import "fmt"

type Plant struct {
	Name    string
	Weather *Weather
}

type Weather struct {
	Temperature int64
	Raining     bool
}

func (plant *Plant) Grow() (result string) {
	if plant.Weather.Raining == true && plant.Weather.Temperature > 18 {
		return plant.Name + "生长了"
	}
	return plant.Name + "没有生长"
}

func main() {
	weather := &Weather{}

	plant := Plant{
		Name:    "苹果",
		Weather: weather,
	}

	fmt.Println("======= 第一天 ========")
	weather.Temperature = 20
	weather.Raining = true
	fmt.Println(plant.Grow())

	fmt.Println("======= 第二天 ========")
	weather.Raining = false
	fmt.Println(plant.Grow())

}

输出

======= 第一天 ========
苹果生长了
======= 第二天 ========
苹果没有生长

4.3 类图

classDiagram Pland --> Weather class Pland{ +String Name +Weather Weather +Grow() } class Weather{ int64 Temperature bool Raining }

5. 聚合关系(Aggregation)

5.1 概念

一种强关联关系,也是一种弱。
表现为A包含B,但B可以不在A创建时创建。

5.2 代码示例

  • 定义一堆水果水果切片是它的成员
  • 实例化一堆水果属于关羽
  • 实例化苹果橘子,将其加入关羽的一堆水果
package main

type Fruit struct {
	Name string
}

type PileOfFruits struct {
	Belong string
	Kinds  []*Fruit
}

func main() {
	//定义一堆水果
	fruitsByGuanYu := PileOfFruits{
		Belong: "guanYu",
	}
	//定义苹果
	apple := &Fruit{
		Name: "苹果",
	}
	//定义橘子
	orange := &Fruit{
		Name: "橘子",
	}
	//将两种水果加入水果堆
	fruitsByGuanYu.Kinds = append(fruitsByGuanYu.Kinds, apple, orange)
}

空心菱形+实线
雁群是由一堆大雁组成的

type Goose struct {
   Bird
}

type Geese struct {
   geese []*Goose
}

5.3 类图

classDiagram PileFruit o.. Fruit class Fruit{ +String Name } class PileFruit{ +String Belong }

6. 组合关系(Composition)

6.1 概念

比聚合关系强的关联关系,是强“拥有”
表现为:B是A的组成部分,且A和B有同样的生命周期。

6.2 代码示例

  • 定义一个结构体,包含成员名字头部身体
  • 定义结构体头部身体
  • 实例化张飞的同时创建身体实例
package main

import "fmt"

type People struct {
	Name string
	Head Head
	Body Body
}

type Head struct {
	Shape string
	Eyes  string
	Nose  string
	Mouth string
}

type Body struct {
	Height int64
	Weight int64
}

func main() {

	zhangFei := People{
		Name: "张飞",
		Head: Head{
			Shape: "豹头",
			Eyes:  "环眼",
			Nose:  "狮子鼻",
			Mouth: "大海口",
		},
		Body: Body{
			Height: 185,
			Weight: 200,
		},
	}
	fmt.Printf("%+v", zhangFei)

}

6.3 类图

classDiagram People *.. Head People *.. Body class People{ +String Name } class Head{ +String Shape +String Eyes +String Nose +String Mouth } class Body{ +Int64 Hight +Int64 Weight }

标签:string,struct,类图,Weather,Golang,weather,type,Name
From: https://www.cnblogs.com/crow1840/p/17529425.html

相关文章

  • golang 解析yaml文件
    初始化packagemainimport( "github.com/spf13/viper")funcinitConfig(){ viper.SetConfigName("config") viper.AddConfigPath("./") iferr:=viper.ReadInConfig();err!=nil{ fmt.Println("Initsetingerror:",......
  • golang之http请求库go-resty
     github: https://github.com/go-resty/resty go-resty特性#go-resty 有很多特性:发起GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,etc.请求简单的链式书写自动解析JSON和XML类型的文档上传文件重试功能客户端测试功能RestyclientCustom RootCertificates andC......
  • Golang起步篇
    一.安装Go语言开发环境1.Wondows下搭建Go开发环境(1).下载SDK工具包sdk下载地址为:https://go.dev/dl/(2).解压下载的压缩包,放到特定的目录下,我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3).配置环境变量步骤1:先打开环境变量配置的界面步骤2:配置......
  • 画出创建型设计模式的类图
    工厂方法FactoryMethod抽象工厂AbstractFactory单例模式Singleton建造者模式Builder原型模式Prototype......
  • golang解决go get下载失败解决办法
    原因:所下载的库依赖有官方库,而官方被封禁网导致。方法:设置代理goenv-wGOPROXY=https://goproxy.cnps:go1.11发布后,还发布一个goproxy提供代理服务,goproxy.cn是专门服务于中国的,依赖于七牛云github地址:https://github.com/goproxy......
  • 画出结构型设计模式的类图
    装饰器模式Decorator适配器模式Adapter桥接模式Bridge组合模式Composite代理模式Proxy静态代理JDK动态代理享元模式Flyweight外观模式Facade ......
  • golang汇编学习(寄存器)
    好久没有写博客了,上一篇写的汇编只是简单的调试了一下,这段时间又看了下,做一个简单的汇总。两个代码汇编代码,1_amd64.sTEXT·add(SB),$0-0MOVQa+0(FP),AXMOVQb+8(FP),BXADDQAX,BXMOVQBX,c+16(FP)RET主函数1.gopackagemainfuncadd(a,bint)intfuncmain()......
  • CentOS 9 x64 使用 Nginx、Supervisor 部署 Go/Golang 服务
    前言在CentOS9x64系统上,可以通过以下步骤来部署Golang服务。1.安装必要的软件包安装以下软件包:Golang:Golang编程语言Nginx:Web服务器Supervisor:进程管理工具Git:版本控制工具EPEL:扩展软件包可以通过以下命令来安装:yum-yupdateyuminstallnginxgolangepel-......
  • CentOS 9 x64 使用 Nginx、Supervisor 部署 Go/Golang 服务
    前言在CentOS9x64系统上,可以通过以下步骤来部署Golang服务。1.安装必要的软件包安装以下软件包:Golang:Golang编程语言Nginx:Web服务器Supervisor:进程管理工具Git:版本控制工具EPEL:扩展软件包可以通过以下命令来安装:yum-yupdateyuminstallnginxgolangepel......
  • Golang实现图片与视频的缩略图生成
    图片与视频的缩略图是一个十分常见的需求,比如即时消息。这里摘取了Golang项目中的相关代码,分享图片与视频相关处理的开发经验。图片缩略图缩略图的尺寸分为两种规则:1)边长模式,生成正方形缩略图;2)宽高模式,又分三种:指定宽高、指定宽(高等比缩放)、指定高(宽等比缩放)。如果原图为png或gif,缩......