
算法与设计模式
文章平均质量分 59
数据结构与设计模式
lbaihao
zephyr,data structure, algorithm, protocol,darknet,architecture
展开
-
设计模式C语言实现--目录
01)设计模式C语言实现(继承、封装、多态)02)设计模式C语言实现(访问者模式)03)设计模式C语言实现(状态模式)04)设计模式C语言实现(命令模式)05)设计模式C语言实现(解释器模式)06)设计模式C语言实现(备忘录模式)07)设计模式C语言实现(观察者模式)08)设计模式C语言实现(桥接模式)09)设计模式C语言实现(建造者模式)10)设计模式C语言实现(中介者模式)11)设计模式C语言实现(策略模式)12)设计模式C语言实现(适配器模式)13.原创 2021-06-17 09:48:04 · 961 阅读 · 0 评论 -
MCU短按长按的功能
首先读取按键的动作,再在switch case 里面匹配引脚的状态,case下用if判断按键动作或按下的时长,对状态、事件进行赋值。* 长按事件:按下时间大于 KEY_LONG_PRESS_TIME,释放后响应。KEY_Action_Release, // 按键动作,按下或释放。#define KEY_PRESSED_LEVEL 0 // 按键被按下时的电平。原创 2023-04-25 08:44:31 · 943 阅读 · 0 评论 -
状态机编程
get_press_key_idx函数,用于洗衣机程序来获取不同按键的按下事件,每次获取后,将按键事件清除(g_keyPressIdx设为无效值-1)本篇介绍的洗衣机的按键,仅需要检测按键单击即可,不需要双击与长按功能,因此,可使用之前文章介绍的最基础的按键状态机来为洗衣机状态机提供按键事件。之前介绍的按键状态机,只有一个按键,本篇需要用到4个按键(除去电源键,3个也可以),因此,需要对按键状态机稍加修改,实现按键状态机的复用。原创 2023-04-24 16:09:27 · 1135 阅读 · 0 评论 -
《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
import cv2import numpy as np def zmMinFilterGray(src, r=7): '''最小值滤波,r是滤波器半径''' '''if r <= 0: return src h, w = src.shape[:2] I = src res = np.minimum(I , I[[0]+range(h-1) , :]) res = np.minimum(res, I[range(1,h)+[.原创 2021-11-11 16:47:22 · 206 阅读 · 0 评论 -
设计模式的C语言实现--工厂模式
简单工厂方法模式1 简介简单工厂方法定义一个用于创建对象的类,该类接受一个参数,通过参数决定创建不同的对象。GOF并没有把简单工厂方法定义为23种设计模式之一,可以认为简单工厂方法是工厂方法的简化形式。为了体现简单工厂方法和工厂方法的区别和联系,此处把简单工厂方法先单独讲一下。2 模拟场景假设你要生产电脑,电脑由硬盘、内存条、CPU、主板的部件组成。你为了保证供应链可靠,每种部件都选择了至少两家供应商。比如:硬盘供应商 seagate、Toshiba内存条供应商 SAMSUNG、Cr原创 2021-06-17 09:44:17 · 640 阅读 · 0 评论 -
C语言实现面向对象编程
GOF的《设计模式》一书的副标题叫做“可复用面向对象软件的基础”,从标题就能看出面向对象是设计模式基本思想。由于C语言并不是面向对象的语言,C语言没有直接提供封装、继承、组合、多态等面向对象的功能,但C语言有struct和函数指针。我们可以用struct中的数据和函数指针,以此来模拟对象和类的行为。所以在正式开始设计模式前,先看看如何用C语言实现面向对象编程。本章针对面向对象的封装、继承、组合、多态给出C语言的实现方法。1 封装封装是指对象仅暴露必要的对外接口(这里指public方法)来和其它原创 2021-06-17 08:42:24 · 4745 阅读 · 0 评论 -
设计模式(二十一)---组合模式
解决的问题:我们PC用到的文件系统,其实就是我们数据结构里的树形结构,我们处理树中的每个节点时,其实不用考虑他是叶子节点还是根节点,因为他们的成员函数都是一样的,这个就是组合模式的精髓。他模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对原创 2016-04-02 23:47:52 · 499 阅读 · 0 评论 -
Unix编程艺术---数据驱动编程
《Unix编程艺术》作者在介绍Unix设计原则时,其中有一条为“表示原则:把知识叠入数据以求逻辑质朴而健壮”。数据驱动编程的核心数据驱动编程的核心出发点是相对于程序逻辑,人类更擅长于处理数据。数据比程序逻辑更容易驾驭,所以我们应该尽可能的将设计的复杂度从程序代码转移至数据。真的是这样吗?让我们来看一个示例。假设有一个程序,需要处理其他程序发送的消息,消息类型是字符串,每个消息都需要一个函数进行处理。第一印象,我们可能会这样处理:void msg_proc(const char *msg...原创 2021-06-15 09:16:52 · 213 阅读 · 0 评论 -
UML学习之:类图
UML学习之:类图1.关于UML回顾20世纪晚期--准确地说是1997年,OMG组织(Object Management Group对象管理组织)发布了统一建模语言(Unified Modeling Language,UML)。UML的目标之一就是为开发团队提供标准通用的设计语言来开发和构建计算机应用。UML提出了一套IT专业人员期待多年的统一的标准建模符号。通过使用UML,这些人员能够阅读和交流系统架构和设计规划--就像建筑工人多年来所使用的建筑设计图一样。2.UML类图在...原创 2021-06-14 10:27:03 · 2782 阅读 · 0 评论 -
UML 类图学习
·车的类图结构为>,表示车是一个抽象类;·它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;·小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;·小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;·学生与班级之间是聚合关系,使用带空心箭头的实线表示;·学生与身份证之间为关联关系,使用一根实线原创 2015-07-08 19:43:01 · 838 阅读 · 0 评论 -
设计模式介绍
设计模式的分类总体来说设计模式分为三大类:(1)结构型模式,共七种:外观模式、组合模式、享元模式、适配器模式、装饰器模式、代理模式、桥接模式。(2)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。(3)行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介原创 2015-11-16 22:38:34 · 476 阅读 · 0 评论 -
设计模式的C语言实现--MVC模式
MVC 编程模式MVC 是三种 ASP.NET 编程模式中的一种。MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:Model(模型)表示应用程序核心(比如数据库记录列表)。 View(视图)显示数据(数据库记录)。 Controller(控制器)处理输入(写入数据库记录)。 MVC 模式定义 Web 应用程序 带有三个逻辑层: 业务层(模型逻辑) 显示层(视图逻辑).原创 2021-06-12 11:39:09 · 1301 阅读 · 0 评论 -
设计模式的C语言实现--适配器模式
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。你想使用一个已经存在的类,而它的接口不符合你的需求。你想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。在单片机C中,该模式用的很少,大概如下:#def...原创 2021-06-12 09:11:46 · 489 阅读 · 0 评论 -
设计模式的C语言实现--桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。在单片机中,该模式用的很少,大概如下:typedef struct _CPU { void (*assemble_cpu_imp)( struct _CPU* cpu ); int type;}...原创 2021-06-12 09:09:04 · 456 阅读 · 0 评论 -
设计模式的C语言实现--策略模式
在软件配置阶段,根据开关状态的不同,我们给一个接口赋一个具体实现,在软件运行阶段,仅调用接口。//开关配置过程typedef void ( *ProcStrategy )( void );void proc_strategy1( void ){ printf( "proc_strategy1\r\n" );}void proc_strategy2( void ){ printf( "proc_strategy2\r\n" );}#define LOWEND_TYP...原创 2021-06-12 09:05:23 · 150 阅读 · 0 评论 -
设计模式的C语言实现--装饰模式
装饰模式是比较好玩,也比较有意义。其实就我个人看来,它和责任链还是蛮像的。只不过责任链是比较判断,而装饰器是迭代处理。装饰模式就是那种迭代处理的模式,关键在哪呢?我们可以看看如下函数。void wapper( int( *func )( int, int ), int num1, int num2 ){ printf( "进入装饰器\n" ); //类似回调函数嘛,函数前后 可以进行装饰或者其他逻辑处理 func( num1, num2 ); printf( "走出装...原创 2021-06-11 16:16:35 · 469 阅读 · 0 评论 -
设计模式应用
分类:根据其目的(模式是用来做什么的)可分为创建型,结构型和行为型三种。创建型主要用于创建对象。结构型主要用于处理对象或类的组合。行为型主要用于描述对象或类怎样交互和怎样分配职责。创建型模式如下:5个建造者模式、工厂模式、抽象工厂模式、单例模式、原型模式结构型模式如下:7个组合模式、适配器模式、装饰模式、外观模式、桥接模式、代理模式、享元模式行为型模式如下:11个观察者模式、状态模式、责任链模式、访问者模式、命令模式、模...原创 2021-06-11 16:11:36 · 183 阅读 · 0 评论 -
设计模式的C语言实现--组合模式
组合模式多个对象形成树形结构以表示“整体--部分”的结构层次。组合模式对单个对象(即叶子对象)和组合对象(即父对象)的使用具有一致性。组合模式又可以称为“合成模式“ 或 ”整体-部分模式”,属于对象的结构型模式,它将对象组织到树形结构中,可以用来描述整体与部分的关系。链表的实现就是一个很好的例子:typedef struct _parse_handler_list { const char *handler; struct _parse_handler_lis...原创 2021-06-11 16:06:27 · 411 阅读 · 1 评论 -
设计模式的C语言实现--外观模式
typedef struct _Computer { void ( *work )( void );} Computer;void work( void ){ printf( "work here!\n" );}typedef struct _Phone { void ( *contact )( void );} Phone;void contact( void ){ printf( "contact here!\n" );}typedef st...原创 2021-06-11 15:58:05 · 269 阅读 · 0 评论 -
设计模式的C语言实现--建造者模式
一句话理解将一个人拆分为:手、脚、头、眼睛、鼻子、嘴,,,各个模块实现自己功能,最终组合为一个人举例 以前买电脑的时候,大家都喜欢自己组装机器。一方面可以满足自己的个性化需求,另外一方面也可以在价格上得到很多实惠。但是电脑是由很多部分组成的,每个厂家都只负责其中的一部分,而且相同的组件也有很多的品牌可以从中选择。这对于我们消费者来说当然非常有利,那么应该怎么设计呢?typedef struct _AssemblePersonalComputer{ void (*assemble_cp..原创 2021-06-11 15:51:18 · 307 阅读 · 0 评论 -
设计模式的C语言实现--观察者模式
抽象出众多对象共同的属性,该属性变化后,其他属性全部跟着改变,而不需要针对每个对象依次修改基本知识1、又叫发布-订阅模式。2、两个角色:观察者和被观察对象3、两者之间存在“观察”的逻辑关联4、当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应5、“观察”不是“直接调用”6、实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。实现步骤1、观察者将自己注册到被观察对象中,被观察对象将观察者存放在一个容器里2、被观察对象发生了某种变原创 2021-06-11 13:56:45 · 676 阅读 · 0 评论 -
设计模式的C语言实现--策略模式
策略模式和状态模式,是大同小异的;状态模式讲究的是状态的变化,和不同状态下,执行的不同行为;而策略模式侧重于同一个动作,实现该行为的算法的不同,不同的策略封装了不同的算法。策略模式适用于实现某一功能,而实现该功能的算法是经常改变的情况。在实际工作中,遇到了实际的场景,可能会有更深的体会策略模式的三种角色抽象策略类(Strategy):定义所有支持的算法的公共接口。具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。环境类(Context) :维护一个对S原创 2021-06-11 09:33:46 · 865 阅读 · 0 评论 -
好的设计模式应该遵守的原则
单一职责原则要求在软件系统中,一个类只负责一个功能领域中的相应职责开闭原则要求一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个系统的行为里氏代换原则可以通俗表述为在软件中如果能够使用基类对象,那么一定能够使用其子类对象依赖倒转原则要求抽象不应该依赖于细节,细节应该依赖于抽象;要针对接口编程,不要针对实现编程接口隔离原则要求客户端不应该依赖那些它不需要的接口,即将一些大的接口细化成一些小的接口供客户端使用合成复用原则要求复用时尽量使用对象组合,而不使用继原创 2021-06-11 09:14:14 · 132 阅读 · 0 评论 -
设计模式的C语言实现--访问者模式
句话理解主要处理一些指定场景的环境,某人或事访问到你之后,根据该人的特性,给予回复。(如果特性会经常性变化,则不适合该设计模式)前提不知不觉当中,我们就到了最后一种设计模式,即访问者模式。访问者模式,听上去复杂一些。但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉。比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜欢这两种豆腐。四川的朋友可能更喜欢辣豆腐,江浙的人就可能对臭豆腐更喜欢一些。那么,这种情况应该怎么用设计模式表达呢?例子typedef原创 2021-06-11 08:49:55 · 278 阅读 · 0 评论 -
设计模式的C语言实现--状态模式
模式动机状态模式(状态机)是嵌入式开发中最重要、最核心的设计模式之一,毫不夸张的说,是否熟练掌握状态模式,很大程度上直接决定了嵌入式工程师的代码掌控能力。在嵌入式开发里面,几乎80%以上的程序都有状态模式(状态机)的影子。在一个思路清晰而且高效的程序中,必然有状态模式(状态机)身影浮现。但是很多嵌入式开发者只是掌握一些很基础的状态机编程,对状态机编程如果提高程序的可维护性和可拓展性并没有一个深刻的理解。这里我通过一个简单易懂的MP3播放器案例,把自己独家总结的状态机六步法分享给大家,帮助大家在啃下状态原创 2021-06-10 22:30:18 · 581 阅读 · 0 评论 -
设计模式的C语言实现--事件处理
嵌入式软件都是接受到一个事件,然后处理。简单的可以是一个按键点灯程序。检测到按键便是一个事件,点灯便是事件的处理。用代码可以这样表达static void LedOn() \\点亮一个LED{ ... }static int isKeyDown() \\检测按键是否按下{ ...}int main(){ while(1){ if(isKeyDown()) //事件检测 LedOn(); ...原创 2021-06-10 22:08:26 · 2883 阅读 · 1 评论 -
设计模式的C语言实现--命令模式
命令模式。先来看一个通讯协议相关的例子,数据帧定义如下:帧长度 传感器类型 数据 1字节 1字节 n字节 传感器数据格式定义如下传感器 类型号 数据格式 温度传感器 1 整型数据(4字节) 湿度传感器 2 整型数据(4字节) 解析实现可如下实现:static int parse(const char *data,size_t n){ int len = data[0]; int type =.原创 2021-06-10 21:26:46 · 326 阅读 · 0 评论 -
数据结构--循环队列
1. 顺序队列的假溢出&循环队列的概念我们已经明白了队列这种基本数据结构,对于顺序队列而言,其存在已经足够解决大多时候的设计问题了,但是其依旧存在一些缺陷和不足,因为我们的入队和出队操作均是直接在其后面进行结点的链接和删除,这就造成其使用空间不断向出队的那一边偏移,产生假溢出。什么是假溢出?打一个比方:(示例顺序队列)回顾一下队列的性质,首先我们有一个顺序队列,这个队列的大小为5,其已经包含了四个元素data1,data2,data3,data4,接着,我们对这个队列进行出队操作,出原创 2021-06-10 09:02:06 · 706 阅读 · 0 评论