巧用NULL模式解耦依赖
1. 初始
应用A和应用B均用到了库libX.a中的类class A:
由于需求的变化,应用B需要库libM.a的能力,以便和服务M交互。为了复用和简化,通过类A间接提供,应用B不用修改代码,只需要重新编译即可获得新的能力,其它用到类A的应用也是如此。
这个时候会产生一个问题,会导致应用A的Makefile也需要指定库libZ.a,否则编译时会报库libZ.a中的符号找不到错误。
需要一种方法来解除应用A对库libZ.a的依赖。
2. 方法一:使用宏限定库libZ.a
这个方法要求类A全头文件方式,不能有.cpp文件,因为需要分别在编译应用A和应用B时选择性开启对库libZ.a的依赖。
这个方法虽然解决了问题,但是应用B得修改,需要增加打开宏的代码,其它有类似需求的应用均需要如此操作,涉及修改面比较大。
3. 方法二:使用NULL模式
这种方法扩展性更好,新增其它的依赖也能应付,已有或不需要新特性的完全不需要修改,编译不受影响,不会被迫依赖libM.a。
|
class IX { public: virtual ~IX() {} virtual void method1() = 0; virtual void method2() = 0; }; class CNullX: public IX { private: virtual void method1() { /* 什么都不做 */ } virtual void method2() { /* 什么都不做 */ } }; class CMX: public IX { private: virtual void method1() { // 调用libM.a和Server M交互 } virtual void method2() { // 调用libM.a和Server M交互 } }; // 原类A class A { public: // 新增默认参数x,并保持和原兼容 A(IX* x=NULL) { _x = (x != NULL)? x: new CNullX; } virtual ~A() { delete _x; } public: void method1() { _x->method1(); } void method2() { _x->method2(); } private: IX* _x; }; // 对于应用A,不用修改任何代码,而且编译时不需要依赖libM.a // 对于应用B,需要微修改,并编译时指定库libM.a和Server void ApplicatonB::f() { CMX* x = new CMX; A a(x); a.method1(); } |
巧用NULL模式解耦依赖的更多相关文章
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 在MVC中使用泛型仓储模式和依赖注入实现增删查改
标签: 原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository ...
- MVC中使用泛型仓储模式和依赖注入
在ASP.NET MVC中使用泛型仓储模式和依赖注入,实现增删查改 原文链接:http://www.codeproject.com/Articles/838097/CRUD-Operations-Us ...
- 使用工厂模式解耦和IoC思想
使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...
- 用最简单的例子理解对象为Null模式(Null Object Pattern)
所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法. 拿"用最简单的例子理解策略模式(Strategy Pattern) ...
- 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦
使用类加载器去加载文件 定义getBean的方法 运行测试方法报错. 在工厂类里面打印输出BeanPath 删除dao的实现类 没有dao的实现类.再次运行程序.编译不报错.运行时报错 以上就是工厂模 ...
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- Unity 3D Framework Designing(2)——使用中介者模式解耦ViewModel之间通信
当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件).越是复杂的页面,被切割出来的子模块就越多,子模块 ...
- Unity应用架构设计(2)——使用中介者模式解耦ViewModel之间通信
当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件).越是复杂的页面,被切割出来的子模块就越多,子模块 ...
随机推荐
- 35-BigDecimal详解
详解 import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class ...
- union和union all区别
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...
- Mysql数据备份与还原
一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先 ...
- mysql5.7 新增的json字段类型
一.我们先创建一个表,准备点数据 CREATE TABLE `json_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'I ...
- STL set,mulityset用法
#include<iostream> #include <set> using namespace std; template <class T> class Ru ...
- 面向服务的架构(SOA)演变图片
公司项目演变 成熟的公司项目结构 对比 总线-服务的注册与发现
- EmguCV Image类中的函数(二)使用MorphologyEx进行更多的变换
MorphologyEx中所有的变换如下图所示 调用方法: Mat aaa = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.R ...
- spring boot (三): 热部署
介绍了Spring boot实现热部署的两种方式,这两种方法分别是使用 Spring Loaded和使用spring-boot-devtools进行热部署. 热部署是什么 大家都知道在项目开发过程中, ...
- RDMA的基础概念
一张图可以简单明确的说明,目前RDMA的几种技术的差别: RDMA是remote Direct memory access的简称,有几个最基本的特点: CPU offload kernel bypas ...
- CF Round #516 (Div. 2, by Moscow Team Olympiad)
前言:依旧菜,\(A\)了\(4\)题,不过这次上蓝了挺开心的. A. Make a triangle! Description 给出\(3\)根木棍,希望用它们拼成三角形,可以将其中的某些木棍增长, ...