zoukankan      html  css  js  c++  java
  • 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;
    }

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

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

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

  • 相关阅读:
    tomcat8.5配置redis实现session共享(tomcat-redis-session-manager-master)
    HDU4292(KB11-H 最大流)
    HDU4280(KB11-G 最大流)
    POJ1149(最大流)
    POJ3281(KB11-B 最大流)
    POJ3436(KB11-A 最大流)
    Codeforces841B
    Codeforces841A
    HDU2255(KB10-K 二分图最大权匹配)
    HDU1281(KB10-D 二分图最大匹配)
  • 原文地址:https://www.cnblogs.com/yuaren/p/3455344.html
Copyright © 2011-2022 走看看