分层与解耦

1.      为什么要进行分层

分层的目的是使软件具有结构性,便于开发、维护和管理。这正是软件开发希望达到的目的。将不同的功能模块独立开来,在改动一个层模块的时候,另一个层能不改变任何内容即可正常使用,这样可以方便代码的复用、替换。

2.      层与层之间的耦合度

软件设计的目标是使层与层之间、模块之间的高内聚、低耦合。耦合是指两个层或者模块之间的关联度。也就是说两者之间的相互影响程度,紧密关系程度。去掉两者之间的耦合性的过程就称为解耦。

3.      解耦

1)面向接口编程——降低耦合性

作为java语言的一个重要内容——接口,在java代码的世界里扮演重要角色。使用接口可以达到高内聚低耦合的作用,是多态性的实现方式之一。提高代码的可扩展性。

不使用接口时候的编程,如在service层调用dao层的模块。代码如下:

publicclassUserService {

   XMLUserDAOxmlUserDAO = new XMLUserDAO();

   publicvoid add(User user){

      xmlUserDAO.add(user);

   }

}

不使用接口,这里的userDAO只能写死了,如果程序发生变动,则daoservice模块都必须进行改动。

   使用接口编程的代码如下:

publicclassUserService {

   IUserDAOuserDAO= newXMLUserDAO();//IUserDAO作为接口接收对象

   publicvoid add(User user){

      userDAO.add(user);

   }

}

在此demo中,IUserDAO定义了dao所应该具有的方法,XMLUserDAO实现了此接口的add(User user)方法。如果需求发生变更,改用jdbc作为存储的数据库,则需要另写一个JDBCUserDAO实现IUserDAO的方法就可以扩展。缺点是需要修改XMLUserDAOJDBCUserDAO

2)工厂模式解耦

publicclassUserService {

   IUserDAO userDAO = (IUserDAO)DaoFactory.getDAO("xmlUserDAO");

   publicvoid add(User user){

      userDAO.add(user);

   }

}

publicclassDaoFactory {

   publicstatic Object getDAO(StringdaoName){

      Objectobj = null;

      if("xml".equals(daoName)){

         obj= newXMLUserDAO();

      }

      return obj;

   }

}

此工厂模式实现了daoservice层的解耦,缺点是需要传入字符串,去选择具体的实现类。

扩展:

工厂类一般都只需要一个对象即可,所以可以用单例模式创建。

字符串也可以采用xml或者properties文件配置的方式读入。

还可以在配置文件中写类的路径名,通过反射机制返回对象。

利用泛型作为参数传递,确定返回值dao的类型。

扩展之后代码如下:

publicclassDaoFactory {

   privatestatic Properties properties = new Properties();

   static{

      //读取配置文件,获得接口对应的实现类

      try {

      properties.load(DaoFactory.class.getClassLoader().getResourceAsStream("daoprop.properties"));

      }catch(IOException e) {

         thrownew RuntimeException(e);

      }

   }

   privatestatic DaoFactory daoFactory = new DaoFactory();

   private DaoFactory(){}

  

   publicstatic DaoFactorygetInstance(){

      returndaoFactory;

   }

   publicstatic <T> TgetDAO(Class<T> classType){

      Stringkey = classType.getSimpleName();

      StringdaoImplClass = properties.getProperty(key);

      try {

         return (T)Class.forName(daoImplClass).newInstance();

      }catch(Exception e) {

         thrownew RuntimeException(e);

      }

   }

}

publicclassUserService {

   DaoFactorydaoFactory= DaoFactory.getInstance();

   IUserDAOuserDAO= DaoFactory.getDAO(IUserDAO.class);

   publicvoid add(User user){

      userDAO.add(user);

   }

}

3springioc实现完全面向接口编程,完全解耦。在容器中实例化对象。

程序在运行过程中,如果需要调用另外一个对象时,无需在代码中创建被调用者,而是依赖外部的注入。

### FreeRTOS 中的分层架构模块解耦设计 在 FreeRTOS 的设计中,采用了典型的分层架构来实现系统的模块化和解耦合。这种结构不仅遵循了嵌入式软件开发中的高层次抽象原则[^2],还使得不同层次之间的交互更加清晰明了。 #### 底层硬件适配层 (Hardware Abstraction Layer, HAL) HAL 是最接近物理设备的一层,在这一层实现了对具体微控制器外设的操作接口封装。这些函数通常由芯片厂商提供或者开发者自行编写,目的是为了屏蔽掉不同的硬件差异,从而让上层的应用程序可以不关心具体的硬件细节而正常工作。 ```c // 示例:简单的 LED 控制 API 定义于 HAL 层 void hal_led_init(void); void hal_led_on(uint8_t led_num); void hal_led_off(uint8_t led_num); ``` #### 内核服务层 (Kernel Service Layer) 该层包含了操作系统的核心功能和服务,比如任务管理、时间管理和信号量机制等。FreeRTOS 提供了一系列标准的任务控制APIs用于创建、删除以及调度线程;同时也提供了同步原语如互斥锁(mutexes),事件组(event groups) 和队列(queues)[^1]。 ```c // 创建新任务的例子 BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char *const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ); // 使用队列传递消息给其他任务 QueueHandle_t xQueue; xQueueSend(xQueue, &dataToSend, portMAX_DELAY); ``` #### 用户应用程序层 (Application Layer) 这是最高级别的逻辑处理部分,它利用下两层所提供的资源完成实际业务需求。由于有了前面提到的良好隔离措施,这里的编程变得相对简单很多——只需要调用相应的库函数即可执行所需操作而不必担心底层复杂性的影响。 ```c // 用户空间内的典型代码片段 void app_task_function(void *parameters){ while(true){ // 执行某些周期性的任务... vTaskDelay(pdMS_TO_TICKS(100)); // 延迟一段时间 // 发送数据到另一个任务或中断 BaseType_t result = xQueueSend(queue_handle, message_ptr, 0UL); } } ``` 通过上述三层式的组织方式,FreeRTOS 成功地将复杂的实时多任务环境简化成了易于理解和使用的组件集合体。这既有利于提高开发效率也方便后期维护升级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值