前端之家收集整理的这篇文章主要介绍了
设计模式-依赖倒转模式(面向接口编程),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
闲谈
@H_
502_8@在公司工作了快一年了,发现以前的重点是放在语言上的(C/C++),回过头来看看,发现语言只是一种工具,实现我们产品的一种实现方式。一个好的产品,在于它的设计框架、在于它的扩展性,灵活性,维护性,复用性(借用面向对象的四大好处)。
@H_
502_8@ 然而为了实现一个好的产品,需要我们来慢慢的积累,慢慢的从使用语言的角度上升到脱离语言,具有全局的意识,可以利用一些设计模式或者框架来使我们产品更加完美,复用。千里之行,始于足下。让我们一起来开始学习设计模式吧。
依赖倒转模式
@H_
502_8@先来看看
依赖倒转原则吧,原话解释是
抽象不依赖细节,细节应该依赖于抽象。通俗的说,就是要
面向接口来编程,多个模块共同抽象出一个通用接口,各个模块的实现都依赖于这个通用接口,以后模块实现可以改变,但是通用接口一直不变。这样就减少了模块间的耦合度,提高了模块内的聚合度。
@H_
502_8@ 以前我们在开发项目时,大多都是要访问
数据库的,所以我们就把访问
数据库代码写成了
函数,每次做新的项目时,就去调
数据库函数,可以说是高层模块依赖低层模块。当低层的
数据库模块由
MysqL更换为oralce时,所有的高层模块
调用低层模块的
代码都需要
修改,造成的巨大工作量可想而知。
@H_
502_8@如果我们对高层模块对低层模块的
调用抽象出一个接口或者抽象类。
高层模块通过实例化接口类,然后调用接口类中提供的接口来调用低层模块,完全不用关心低层模块是怎么实现接口的;低层模块通过继承来实现接口,无需关心高层模块怎么
调用。这样就实现了程序模块间的分离,即使后面低层模块实现更改了,高层模块也不用担心。或者是高层模块的业务逻辑改变了,只要接口没有变,低层也不用关心。
电脑例子
@H_
502_8@举个例子,电脑相当于一个我们需要实现的产品,我们定义了好了主板与
cpu、硬盘、内存、显卡之间的接口。生产
cpu的厂商不管是Inter还是AMD都只需要按照接口来实现
cpu,无需关心其他模块;显卡厂商只需要根据接口来实现显卡,也无需关心其他模块。当我们电脑某个模块坏了,如内存条坏了,我们只需更换一条内存条就好了,而没有必要将电脑返厂进行整套检测和维修。
自己理解
@H_
502_8@ 如何做到面向接口的编程,其实很简单。面向接口编程的本质是:
@H_
502_8@1、定义接口:可以是多方共同定义一个统的接口,也可是客户(需求方)提供一个接口
@H_
502_8@2、实现接口 :一般是服务方通过实现接口,来完成客户(需求方)的要求
@H_
502_8@3、
调用接口:客户(需求方)通过
调用定义的接口来完成与不同服务方的对接,无需关心是哪一方实现。
C语言例子
@H_
502_8@ 有些简单,但是可以引导一下大家
#include <stdio.h>
#include <string.h>
/*定义函数指针类型 ==> 定义接口*/
typedef int (*Communication)(int sendID,int revID,char msg[100]);
/*函数指针做函数参数 ==>调用接口,不管是谁实现的接口*/
int useComm(int sendID,char msg[100],Communication comcate)
{
int ret = 0;
ret = comcate(sendID,revID,msg);
if(ret == 0)
{
printf("Communication is normal.msg is %s\n",msg);
}
else
{
printf("Communication is error.reasonCode=%d\n",ret);
}
}
/*华为厂商实现接口*/
int CommunicationHW(int sendID,char msg[100])
{
printf("sendID:%d send revID:%d msg is %s.(bad msg).\n @HW\n",sendID,msg);
return 1;
}
/*中兴厂商实现接口*/
int CommunicationZTE(int sendID,char msg[100])
{
printf("sendID:%d send revID:%d msg is %s.\n @ZTE\n",msg);
return 0;
}
int main()
{
int sendID = 1001;
int revID = 2002;
char msg[100] = {0};
int ret = 0;
strcpy(msg,"hello 2002,I am 1001,I miss you !");
/*调用华为厂商实现的接口*/
ret = useComm(sendID,msg,CommunicationHW);
if(ret != 0)
{
printf("HW Implement interface error,please not use HW\n");
}
else
{
printf("HW Implement interface good,please use HW\n");
}
/*调用中兴厂商实现的接口*/
ret = useComm(sendID,CommunicationZTE);
if(ret != 0)
{
printf("ZTE Implement interface error,please not use ZTE\n");
}
else
{
printf("ZTE Implement interface good,please use ZTE\n");
}
}
@H_
502_8@
输出:
@H_
502_8@沙米水平有限,希望大家多多指导,一起探讨,一起提高。