定义
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
要点
- 代码可复用、可扩充、可维护 (写一段函数代码很简单,难的是后期的修改,维护)
- 针对接口编程,不针对实现编程
类图
代码实现及实例
下面是rt_thread系统中的关于设备操作功能的代码实现。
<strategy>
struct rt_device { . . . /* common device interface */ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, rt_uint8_t cmd, void *args); . . . };
在嵌入式环境中,串口、SD卡、网卡等等都可以认为是设备。下面是rt_thread中对串口设备的实现代码
<concretestrategy>
static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag) { return RT_EOK; } static rt_err_t rt_serial_close(rt_device_t dev) { return RT_EOK; } static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) { rt_uint8_t* ptr; rt_err_t err_code; struct stm32_serial_device* uart; ptr = buffer; err_code = RT_EOK; uart = (struct stm32_serial_device*)dev->user_data; if (dev->flag & RT_DEVICE_FLAG_INT_RX) { /* interrupt mode Rx */ while (size) { rt_base_t level; /* disable interrupt */ level = rt_hw_interrupt_disable(); if (uart->int_rx->read_index != uart->int_rx->save_index) { /* read a character */ *ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index]; size--; /* move to next position */ uart->int_rx->read_index ++; if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) uart->int_rx->read_index = 0; } else { /* set error code */ err_code = -RT_EEMPTY; /* enable interrupt */ rt_hw_interrupt_enable(level); break; } /* enable interrupt */ rt_hw_interrupt_enable(level); } } else { /* polling mode */ while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size) { while (uart->uart_device->SR & USART_FLAG_RXNE) { *ptr = uart->uart_device->DR & 0xff; ptr ++; } } } /* set error code */ rt_set_errno(err_code); return (rt_uint32_t)ptr - (rt_uint32_t)buffer; }
策略模式应该在实际工作中会被大量用到,或者你可能用到这个模式了,但是不知道你正在使用的就是策略模式。这个模式不足的地方,编程的时候,使用接口时,你要知道实现了接口的某个算法具体是做什么的,但是在嵌入式,无操作系统的环境下,对编程人员来说,一切都是透的,个人觉得这不是什么问题了,很简单,很实用,后期维护修改时也很方便
发一段网上看到的话,赞同
从某种意义上说,设计思想构成了软件的主题。软件原则是我们在开发中的必须遵循的准绳。软件编写模式是开发过程中的重要经验总结。灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。毕竟对于广大的软件开发者来说,软件的维护时间要比软件编写的时间要多得多。编写过程中,难免要有新的需求,要和别的模块打交道,要对已有的代码进行复用,那么这时候设计模式就派上了用场。