C与设计模式---策略模式

定义

  定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

要点

  • 代码可复用、可扩充、可维护 (写一段函数代码很简单,难的是后期的修改,维护)
  • 针对接口编程,不针对实现编程

类图

  

代码实现及实例

   下面是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;
}

 策略模式应该在实际工作中会被大量用到,或者你可能用到这个模式了,但是不知道你正在使用的就是策略模式。这个模式不足的地方,编程的时候,使用接口时,你要知道实现了接口的某个算法具体是做什么的,但是在嵌入式,无操作系统的环境下,对编程人员来说,一切都是透的,个人觉得这不是什么问题了,很简单,很实用,后期维护修改时也很方便

发一段网上看到的话,赞同

     从某种意义上说,设计思想构成了软件的主题。软件原则是我们在开发中的必须遵循的准绳。软件编写模式是开发过程中的重要经验总结。灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。毕竟对于广大的软件开发者来说,软件的维护时间要比软件编写的时间要多得多。编写过程中,难免要有新的需求,要和别的模块打交道,要对已有的代码进行复用,那么这时候设计模式就派上了用场。
    

原文地址:https://www.cnblogs.com/yuaren/p/3455344.html