go语言设计模式之Strategy
package main import ( "flag" "fmt" "image" "image/color" "image/draw" "image/jpeg" "log" "os" ) var output = flag.String("output", "console", "The output to use between 'console' and 'image' file") type PrintStrategy interface { Print() error } type ConsoleSquare struct{} type ImageSquare struct { DestinationFilePath string } func (c *ConsoleSquare) Print() error { println("Square") return nil } func (t *ImageSquare) Print() error { width := 800 height := 600 origin := image.Point{0, 0} bgImage := image.NewRGBA(image.Rectangle{ Min: origin, Max: image.Point{X: width, Y: height}, }) bgColor := image.Uniform{color.RGBA{R: 70, G: 70, B: 70, A: 0}} quality := &jpeg.Options{Quality: 75} draw.Draw(bgImage, bgImage.Bounds(), &bgColor, origin, draw.Src) squareWidth := 200 squareHeight := 200 squareColor := image.Uniform{color.RGBA{R: 255, G: 0, B: 0, A: 1}} square := image.Rect(0, 0, squareWidth, squareHeight) square = square.Add(image.Point{ X: (width / 2) - (squareWidth / 2), Y: (height / 2) - (squareHeight / 2), }) squareImg := image.NewRGBA(square) draw.Draw(bgImage, squareImg.Bounds(), &squareColor, origin, draw.Src) w, err := os.Create(t.DestinationFilePath) if err != nil { return fmt.Errorf("Error opening image.") } defer w.Close() if err = jpeg.Encode(w, bgImage, quality); err != nil { return fmt.Errorf("Error writing image to disk") } return nil } func main() { flag.Parse() var activeStrategy PrintStrategy switch *output { case "console": activeStrategy = &ConsoleSquare{} case "image": activeStrategy = &ImageSquare{"D:/tmp/image.jpg"} default: activeStrategy = &ConsoleSquare{} } err := activeStrategy.Print() if err != nil { log.Fatal(err) } }
go语言设计模式之Strategy的更多相关文章
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- 设计模式 策略-Strategy,装饰-Decorator,观察者-Observer
重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 设计模式之Strategy(策略)(转)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲 ...
- 设计模式(21)--Strategy(策略模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而 ...
- Go语言设计模式实践:迭代器(Iterator)
关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...
- Go语言设计模式实践:组合(Composite)
关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...
随机推荐
- C# 调用OpenCVSharp报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
一.描述问题 当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存.这通常指示其他内存已损坏”. 二.原因分析 由于非托管代码的内存指针的回收是由非托管代码自身手动完成的, ...
- centos开启ftp服务
新安装的要先配置网络 $_> vi /etc/sysconfig/network-scripts/ifcfg-eno16777736 最后一行 onboot = yes $_> yum i ...
- report for PA2
目录 说明 Report for PA 2(writed with vim) Part i - pa2.1 Steps: instr(seperately) Part ii - 2.2 Part ii ...
- jsp + js + 前端弹出框
在项目中,前端页面我们时常需要各种各样的弹出框: 1.alert对话框:显示含有给定消息的"JavaScript Alert"对话框 代码: var a = "Hello ...
- Flutter安装入门教程
### 前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的开发者和 ...
- Android lifecyle 源码解剖 - gdutxiaoxu的博客(微信公众号 stormjun94)
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...
- spring boot 加入mail邮件支持
一.添加依赖 <!-- 邮件整合 --> <dependency> <groupId>org.springframework.boot</groupId> ...
- i2c中start和restart的区别【转】
有的硬件芯片提供了一个个寄存器,供我们很好的操作i2c,但是,在用的时候,我们是不知道他到地是怎么操作的,下边,我就探讨下i2c中的start和restart的区别. start是在scl是高电平的时 ...
- 07-Node.js学习笔记-路由
路由 http://localhost:3000/index http://localhost:3000/login //路由是指客户端请求地址与服务器端程序代码的对应关系.简单的说,就是请求什么响应 ...
- jmeter相关知识学习记录
基于Jmeter5.2.1 断言之响应断言 响应断言:对服务器的响应接口进行断言校验,来判断接口测试得到的接口返回值是否正确. 测试字段就是指要断言的内容的匹配处. 响应文本:就是响应的body部分: ...