Go设计模式之代理模式
简介代理模式为一个对象提供一种代理以控制对该对象的访问,它是一个使用率非常高的设计模式,即使在现实生活中,也是很常见,比如演唱会门票黄牛。假设你需要看一场演唱会,但是官网上门票已经售罄,于是就当天到现场通过黄牛高价买了一张。在这个例子中,黄牛就相当于演唱会门票的代理,在正式渠道无法购买门票的情况下,你通过代理完成了该目标。
从演唱会门票的例子我们也可以看出,使用代理模式的关键在于当Client不方便直接访问一个对象时,提供一个代理对象控制该对象的访问。Client实际上访问的是代理对象,代理对象会将Client的请求转给本体对象去处理。
作用通过代理对象来增强目标对象的功能。利用的是AOP横切的思想。
代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172package mainimport "fmt"type Goods struct { ...
Go设计模式之命令模式
医生治疗:
123456789101112131415161718package mainimport "fmt"type Docker struct{}func (d *Docker) treatEye() { fmt.Println("医生治疗眼睛")}func (d *Docker) treatNose() { fmt.Println("医生治疗鼻子")}func main() { docker := &Docker{} docker.treatEye() docker.treatNose()}
这样的代码有一个问题。加入Docker是一个非常核心的模块。不希望和某个业务耦合度高。应该支持迪米特法则。修改成需要填写病单。
1234567891011121314151617181920212223242526272829303132333435package mainimport "fmt"ty ...
Go设计模式之建造者模式
123456789101112131415161718obj := &MyObject{ Field1: &Field1 { Param1: &Param1 { Val: 0, }, Param2: &Param2 { Val: 1, }, ... }, Field2: &Field2 { Param3: &Param3 { Val: 2, }, ... }, ...}
上述的对象创建方法有两个明显的缺点:
(1)对对象使用者不友好,
使用者在创建对象时需要知道的细节太多;
(2)代码可读性很差。
针对这种对象成员较多,创建对象逻辑较为繁琐的场景,就适合使用建造者模式来进行优化。
建造者模式的作用有如下几个:
1、封装复杂对象的创建过程,使对象使用者不感知复杂的创建逻辑。
2、可以一步步按照顺序对成员进行赋值,或者创建嵌套对象,并最终 ...
Go设计模式之装饰模式
和代理模式很相似。不过比代理模式更灵活,动态给类添加功能。符合开闭原则。
案例一开始有个手机(裸机Phone类),如果需要不断的为这个Phone增添某个功能从而变成一个新功能的Phone,就需要一个装饰器的类,来动态的给一个类额外添加一个指定的功能,而生成另一个类,但原先的类又没有改变,不影响原有系统的稳定。
在装饰器模式中,“裸机”、“有贴膜的手机”、“有手机壳的手机”、“有手机壳&贴膜的手机”都是一个构件。“贴膜装饰器”、“手机壳装饰器”是装饰器也是一个构件。
类图
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667package mainimport "fmt"type Phone interface { Show()}// 抽象的装饰器,该类本应该是interface,// 由于Golang语法的interface不可以有成员属性 ...
Go设计模式之适配器模式
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
优点:
(1) 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
类图
代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package mainimport "fmt"// 适配目标type V5 interface { UseV5()}// 被适配的角色type V220 struct{}func (v *V220) User220v() { fmt.Println("使用220V的电压")}// 适配器type Adapter struct { V220 *V220}func (a *Adapter) UseV5() { a.V220.User220v() fmt.Println( ...
Go设计模式之工厂模式
优点:
不需要记住具体类名,甚至连具体参数都不用记忆。
实现了对象创建和使用的分离。
系统的可扩展性也就变得非常好,无需修改接口和原类。
对于新产品的创建,符合开闭原则。
类图
代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package abstractfactoryimport "fmt"type Fruit interface { Show()}type Factory interface { CreateFruit() Fruit}// appletype Apple struct{}func (a *Apple) Show() { fmt.Println("我是苹果")}type AppleFactory struct{}func (af *AppleFactory) Crea ...
Go设计模式之抽象工厂模式
相较于工厂模式,在我们每次增加工厂的时候。都需要这样的代码
1234567891011// strawberrytype Strawberry struct{}func (a *Strawberry) Show() { fmt.Println("我是Strawberry")}type StrawberryFactory struct{}func (af *StrawberryFactory) CreateFruit() Fruit { return new(Strawberry)}
每次多创建一个StrawberryFactory。
也就是说产品增加,产品的工厂也需要增加,1比1的关系。抽象工厂模式解决这样的问题。
优点:
拥有工厂方法模式的优点
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点: 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修 ...
Go设计模式之单例模式
它主要用于保证一个类仅有一个实例,并提供一个访问它的全局访问点。
用途:通常,被建模成单例的对象都有“中心点”的含义,比如线程池就是管理所有线程的中心。所以,在判断一个对象是否适合单例模式时,先思考下,这个对象是一个中心点吗?
代码实现需要注意的四点:
限制调用者直接实例化该对象;
为该对象的单例提供一个全局唯一的访问方法。
频繁的创建和销毁一则消耗CPU,二则内存的利用率也不高,通常都会使用对象池技术来进行优化。
饿汉模式和懒汉模式
饿汉模式:系统加载的时候就已经完成了初始化
懒汉模式:对象被使用的时候,才会去初始化。
饿汉模式123456789101112131415161718192021222324252627type Message struct { Count int}// 小写type messagePool struct{ pool *sync.Pool}// 消息池单例,满足上面的第一点var msgPool = &messagePool{ pool: &sync.Pool ...
无题
先暴露端口
1kubectl expose deployment nginx-app -n ing-internal --port=5678 --target-port=80
123456789101112131415161718apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: ping namespace: ing-internal annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - http: paths: - path: /hi pathType: Prefix backend: service: name: hello port: number: 5678
Kubernates基础概念及安装
1.Kubernates简介在非常大的服务中,仅仅一个服务可能有几十个上百个容器。
我们急需一个大规模容器编排系统
kubernetes具有以下特性:
服务发现和负载均衡Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
自我修复Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管 ...