结合Golang聊聊23种设计模式---行为型(3)
结合Golang聊聊23种设计模式—行为型(3)责任链模式责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
责任链模式的英文翻译是 Chain Of Responsibility Design Pattern。
在 GoF 的《设计模式》中,它是这么定义的:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
翻译成中文就是:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
这么说比较抽象,我用更加容易理解的话来进一步解读一下。在 ...
结合Golang聊聊23种设计模式---行为型(2)
结合Golang聊聊23种设计模式—行为型(2)策略模式策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的:
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
翻译成中文就是:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。
我们知道,工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。
为什么要使用策略模式策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
我们可以利用策略模式来移除 if-else ...
结合Golang聊聊23种设计模式---行为型(1)
结合Golang聊聊23种设计模式—行为型(1)
我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“类或对象之间的交互”问题。
行为型设计模式比较多,有 11 个,几乎占了 23 种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
观察者模式观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are ...
结合Golang聊聊23种设计模式---结构型(2)
结合Golang聊聊23种设计模式—结构型(2)适配器模式适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的
为什么要使用适配器模式适配器模式可以将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。
代码示例这里有一段客户端代码, 用于接收一个对象 (Lightning 接口) 的部分功能, 不过我们还有另一个名为 adaptee 的对象 (Windows 笔记本), 可通过不同的接口 (USB 接口) 实现相同的功能
这就是适配器模式发挥作用的场景。 我们可以创建这样一个名为 adapter 的结构体:
遵循符合客户端期望的相同接口 (Lightning 接口)。
可以适合被适配对象的方式对来自客户端的请求进行 “翻译”。 适配器能够接受来自 Lightning 连接器的信息, 并将其转换成 USB 格式的信号, 同时将信号传递给 Windows 笔记本的 USB 接口。
...
结合Golang聊聊23种设计模式---结构型(1)
结合Golang聊聊23种设计模式—结构型(1)结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。
代理模式代理模式(Proxy Design Pattern)它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。
为什么要使用代理模式第一,防止框架如监控、统计、鉴权、限流、事务、幂等、日志,缓存等代码侵入到业务代码中,跟业务代码高度耦合。如果未来需要替换这个框架,那替换的成本会比较大。
第二,框架代码跟业务代码无关,本就不应该放到一个类中。业务类最好职责更加单一,只聚焦业务处理。
代理类负责在业务代码执行前后附加其他逻辑代码,并通过委托的方式调用原始类来执行业务代码。具体的代码实现如下所示:
Nginx 这样的 Web 服务器可充当应用程序服务器的代理:
提供了对应用程序服务器的受控访问权限。
可限制速度。
可缓存请求。
server.go: 主体12345package maintype server interfac ...
结合Golang聊聊23种设计模式---创建型
结合Golang聊聊23种设计模式—创建型
将不要过度设计也不要随意堆砌烂代码写在前面设计模式要干的事情就是解耦,也就是利用更好的代码结构将一大坨代码拆分成职责更单一的小类,让其满足高内聚低耦合等特性。创建型模式是将创建和使用代码解耦,结构型模式是将不同的功能代码解耦,行为型模式是将不同的行为代码解耦。而解耦的主要目的是应对代码的复杂性。设计模式就是为了解决复杂代码问题而产生的。因此,对于复杂代码,比如项目代码量多、开发周期长、参与开发的人员多,我们前期要多花点时间在设计上,越是复杂代码,花在设计上的时间就要越多。 不仅如此,每次提交的代码,都要保证代码质量,都要经过足够的思考和精心的设计,这样才能避免烂代码效应(每次提交的代码质量都不是太好,最终积累起来整个项目的质量就变得很差)。相反,如果你参与的只是一个简单的项目,代码量不多,开发人员也不多,那简单的问题用简单的解决方案就好,不要引入过于复杂的设计模式,将简单问题复杂化。
单例模式为什么要使用单例?单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是 ...
高性能 Golang 并发包 -- ant
高性能 Golang 并发包 – ant
接触了很多比较热的并发包和小工具,比如之前我写到的Tunny,Machinery等等,我觉得设计的最好的还是 ant,当然Tunny更轻便,Machinery主打分布式并发处理各自有自身优势,但如果你要选一个单服务进行的生产消费的并发处理包,那一定是 ant。
ant 把很多性能优化都做到了很好,在高并发种容易出现的内存泄露,GC压力等问题都在设计上进行了很好的规避,让性能做到起飞。
下面我通过源码来和大家一起学习下它的一些精彩设计。
程序流程:ant 的主体是pool结构 ,pool结构管理着worker队列,worker是执行任务的最小单位。
生产者不断提交任务给pool,pool 进行任务的调度处理。
下面是整个包工作的流程图:
主体架构整个包设计的主体分为三层最上层是pool 接够,中层是queue结构,底层是worker结构。
处理任务的最小单位是worker 结构,queue其实就一个worker的队列,负责worker的调度和清理等工作,pool是最上层的结构也就是我们接触到的使用结构,pool主要负责并发数量控制,task发 ...
使用 Maxwell 订阅 MySQL binlog 同步至 Kafka
使用 Maxwell 订阅 MySQL binlog 同步至 Kafka
Maxwell 是一款开源的 MySQL binlog 数据同步工具,它可以实时解析 MySQL binlog,将数据变更事件转换为 JSON 格式,然后推送至 Kafka 等消息队列中。
它是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。实时读取MySQL 二进制日志 Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。
这篇文章尽量简单的描述关键步骤,具体的实践小例子我通过代码来给大家呈现了,我的代码用golang编写包括简单数据插入mysql到触发Maxwell生产信息并通过Kafka消费解析binlog数据代码中都有详细的说明哦
我的代码在这里
Mysql主从复制过程
Master 主库将改变记录,写到二进制日志(binary log)中
Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 bin ...
程序员如何为女朋友做迪士尼攻略
程序员如何为女朋友做迪士尼攻略
身为一个程序员,我们每天大多时间对着计算机没有交际应酬,更不懂得浪漫与体贴。我能为女朋友做点什么呢?我是不是能用我的专业来帮女票做点事情。刚好女票生日计划去迪士尼玩,做攻略的重任就落到了我的身上。
我利用数据和逻辑科学的帮助女友生成了一份攻略,代码在这里
前言我在苦思冥想该怎么做攻略的时候看了很多小红书,视频,还有直播,我发现他们都会给出游玩攻略。但很可惜他们清一色的就是告诉你该以什么顺序去玩却不告诉你形成攻略的具体逻辑是什么,他们形成攻略的说辞基本就是靠经验,这对于我一个逻辑至上的程序员来说是不能忍受的。所有的up主都千篇一律的就是第一个冲翱翔地平线,第二个小矮人矿车。。。
我知道他们通过经验形成的逻辑点就是在最早的时间冲最火的项目,这样在主观感受上确实是可以节省更多时间。但最火的项目在早上不也一样是最火的?不也一样等的时间比其他的久,在所有项目都接近排队时长最短的黄金早晨时间项目排队耗费时间也是能否玩更多项目的关键。
我觉得可以根据多日的单项目不同时间点平均等待时间辅以一些算法来获取一个项目游玩优先级权重。
攻略思路在早8:00 - 9:00 时间 ...
深入理解 Docker
深入理解 Docker
随着云计算技术的发展,容器技术应运而生,他解决了大家在本地,测试,线上等不同环境下进行构建,部署的环境不统一的蛋疼问题,随之而来的是Kubernetes、微服务架构等新技术新思想这些技术不仅将各种繁琐的构建,部署环境问题完全隔离,我们的服务也向高可用, 可拓展的方向精进。
容器是如何解决环境统一性的问题的?有是如何做到统一环境的快速复制迁移的?带着这些问题我们来深入了解些容器(Docker)。
本文章为张磊老师的《深入剖析Kuernetes》容器部分的整合
Docker 是什么容器其实是一种沙盒技术。它可以让开发者将应用程序和依赖项打包成一个可移植的容器,从而实现快速部署、可移植性和可伸缩性。Docker 技术基于 Linux 容器(LXC)技术,通过隔离应用程序和依赖项的运行环境,使得应用程序在不同的计算机环境中能够保持一致的运行效果。
所谓 Docker 镜像,其实就是一个压缩包。但是这个压缩包里的内容,比 PaaS 的应用可执行文件 + 启停脚本的组合就要丰富多了。实际上,大多数 Docker 镜像是直接由一个完整操作系统的所有文件和目录构成的,所以这个 ...