go的三大基本特性
5-3
测试代码
代码
5-1
4-4
代码
4-3
测试代码
\
4-2
测试代码
代码
4-1
3-1
pattern
设计模式分类
一、创建型:
单例、简单工厂、工厂方法模式、抽象工厂模式、创建者模式、原型模式
二、结构型:
代理模式、适配器模式、装饰模式、桥接模式、组合模式、享元模式、外观模式
三、行为型:
观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式
课上讲的装饰器模式的例子:
别的资料里我看到的例子里,不一定有抽象装饰者。有的直接是具体的装饰者类实现了抽象组件,同时在具体的装饰者类里增加一个属性,类型为抽象组件。这样就可以把具体的组件传入装饰者的constructor(), 但是某具体的组件的方法则是被覆盖成装饰者里的方法
比如下面这个logger 例子
https://blog.csdn.net/qq_24448899/article/details/78068813
http中间件能比较好体现装饰模式
为什么要搞中间件?
下图是在hello这个handler中实现了3个功能。但是如果有多个handler,这样的非业务代码都要重写。并且非业务和业务代码糅合一起。不好!所以
然后后面就没听懂了
上面例子里右边更好。因为左边违反了依赖反转。BMW依赖了v6eng的具体实现。
// 测试代码
package demo4_1
import (
"fmt"
"testing"
)
// 直接创建产品
func TestProduct_Create(t *testing.T) {
product1 := Product1{} // 创建产品1
product1.SetName("p1") // 给产品1设置名称
name := product1.GetName() // 获取产品1名称
fmt.Println(name)
product2 := Product2{}
product2.SetName("p2")
name2 := product1.GetName()
fmt.Println(name2)
}
// 简单工厂方式创建
func TestProductFactory_Create(t *testing.T) {
factory := ProductFactory{} //定义产品工厂,待工厂生产指定类型产品
product1 := factory.Create(p1) // 工厂根据指定,生产产品1
product1.SetName("p1") // 给产品1设置名称
name := product1.GetName() // 获取产品1名称
fmt.Println(name)
product2 := factory.Create(p2)
product2.SetName("p2")
name2 := product2.GetName()
fmt.Println(name2)
}
// 课程代码
package demo4_1
// Product 实现一个产品抽象
type Product interface {
SetName(name string) // 设置产品名称
GetName() string // 获取产品名称
}
// Product1 实现具体的产品:产品1,他有两个方法
type Product1 struct {
Name string // 产品1的名称
}
// SetName 设置产品名称
func (p1 *Product1) SetName(name string) {
p1.Name = name
}
// GetName 获取产品名称
func (p1 *Product1) GetName() string {
return "产品1的name为:" + p1.Name
}
// Product2 实现具体的产品:产品2,他有两个方法
type Product2 struct {
Name string // 产品1的名称
}
// SetName 设置产品名称
func (p2 *Product2) SetName(name string) {
p2.Name = name
}
// GetName 获取产品名称
func (p2 *Product2) GetName() string {
return "产品1的name为:" + p2.Name
}
type productType int // 产品类型变量
const (
p1 productType = iota // 0
p2 // 1
)
// ProductFactory 实现简单工厂类
type ProductFactory struct {
}
// Create 产品工厂根据传入的产品类型,创建出具体产品实现。
func (pf *ProductFactory) Create(productType productType) Product {
if productType == p1 {
return &Product1{}
}
if productType == p2 {
return &Product2{}
}
return nil
}
设计模式分类
策略模式总结
设计模式=武功招式
算法数据结构=内功
常见设计模式
面向对象要有三大特征
设计代码时遵循五大原则
结构嵌套结构依赖于具体的实现
结构嵌套方法依赖于接口
BM嵌套v6Engine,车里只有一种具体的引擎
BM嵌入engine接口,车里可以安装不同的引擎符合依赖反转原则
单一功能原则
作图如果有三轮车新加入要重新定义三轮车结构和方法不对已经实现的Car和bike做修改符合开闭原则
go的接口自动符合里氏替换
为什么学设计模式?
程序员的一种术语方便交流
提高代码质量提高可复用可扩展性解耦
设计模式分类