这个OO设计原则,策略模式中也有运用,先参照代码和代码注释简单了解一下:

public abstract class Cat
{IEatBehavior pEatBehavior;  // 用接口定义一个变量(针对接口编程)public void Eat(){pEatBehavior.Eat();    }...
}

  再写一个针对实现编程的代码示例  

public abstract class Cat
{WhiteCatEatBehavior pWhiteCatEatBehavior;  // 用具体类定义一个变量(针对实现编程)public void Eat(){pWhiteCatEatBehavior.Eat();     }...
}

  下面来说说具体是怎么一回事。。。

  “针对接口编程”的真正意思是“针对超类型编程(超类型有 接口,超类等)”。针对接口编程 关键就在 多态。利用多态,程序可以针对超类型编程,执行时,会根据 实际情况 执行到 真正的行为,不会被绑死在 超类型的行为上(特定的具体行为 编写在 实现了超类型的 类中。如果觉得有点抽象,可以参阅上篇,比如白猫吃的行为 写在实现了接口 IEatBehavior 的类 WhiteCatEatBehavior 中,而不是写在超类 Cat 中)。

  “针对接口编程” 这句话可以更明确地说成 “变量的 声明类型 应该是 超类型”(上面例子:IEatBehavior pEatBehavior;),如此,只要是 具体实现 此超类型的类 的所产生对象,都可以指定给这个变量。这也意味着,声明类时,不用理会 以后执行时的 真正对象类型。相应的“针对实现编程”可以说成“变量的声明类型是具体类”。

  再举一个简单的例子,假如有一个超类Animal,和两个实现了超类Animal的具体类Cat,Dog。

针对实现编程:Dog pDog = new DogClass();pDog.Bark();针对接口编程:Animal pAnimal = new DogClass();pAnimal.Bark();        

  你可能会说Animal pAnimal = new DogClass()后面new的部分不也是面对实现编程吗?是的,确实,但也有解决方案,你可以使用工厂模式进行创建对象(工厂模式也是设计模式的一种,主要用于创建对象,以达到解耦的目的),这样就完全符合针对接口编程。当然,也得结合实际情况考虑一下,是否真有必要这样做。

  OO设计原则和各种设计模式都只是一种参考,怎样有效地使用它,需要根据具体的情况。如果可以用另一种方法可以很好地解决问题,那我们就不必再去纠结如何使用设计模式。我们的目的是简单有效的解决问题,并且便于以后的维护和扩展,而不是如何使用设计模式。就上面的例子,就无需再使用工厂模式去创建对象,这样只会使得程序变得更加复杂而已。。。

  篇幅比较小,也有点抽象,希望对你有所帮助。。。

转载于:https://www.cnblogs.com/hachun/p/3445389.html

针对接口编程,不要针对实现编程相关推荐

  1. 从针对接口编程到依赖注入

    1.概况说明 2.猫狗大战举例 3.说明为什么要针对接口编程,优点 4.说明为什么要"依赖抽象,不要依赖具体类" 5.说明"依赖倒置"与抽象工厂模式 6.说明& ...

  2. 设计原则 —— 针对接口编程而不针对实现编程

    对"针对接口编程,而不是针对实现编程"的理解 应该针对接口编程 而不是针对实现编程 0. 理解 接口,定义了一堆空实现函数的接口,如下,是对其全部实现类的约束,即必须实现我(接口) ...

  3. 设计引导---不要再盲目的new了!你要学着针对接口编程!(具体方法,Factory,Abstract Factory)...

    应园友提议,本篇博将帮助大家解决"针对接口编程"这一疑惑.而我所讲的例子将从上一篇设计引导---一个鸭子游戏引发的设计(多态,继承,抽象,接口,策略者模式)的案例中,延伸下来,让大 ...

  4. 对“针对接口编程,而不是针对实现编程”的理解

    对"针对接口编程,而不是针对实现编程"的理解 今天在阅读<Head First设计模式>的时候,看到了这句话:"针对接口编程,而不是针对实现编程", ...

  5. 学习编码:15个针对软件开发人员的免费教育性编程课程

    如果您正在考虑学习编码,那么弄清楚从哪里开始可能是最难的部分之一. 为此,我在下面列出了15项完全免费的课程,以帮助您开始自己的旅程. 这里不仅有初学者,也有资深人士. Ťhese courses a ...

  6. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  7. python异步编程视频_asyncio异步编程【含视频教程】

    Python Python开发 Python语言 asyncio异步编程[含视频教程] 不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3. ...

  8. 初探儿童编程,如何学习编程及幼儿逻辑训练的必要性

    前言 这两年儿童编程很火,火得"不能让孩子输在起跑线上"的爸爸妈妈们又又又焦躁起来,又又开始给孩子报编程培训班.儿童学编程合适吗?我认为:很合适,只要他们有兴趣.兴趣不是天生的是培 ...

  9. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

最新文章

  1. Asp.net设计模式笔记之一:理解设计模式
  2. mysql修改表引擎Engine
  3. BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)
  4. 我关注了389个公众号,这10个牛XXX的推荐给你!
  5. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
  6. [转]JavaScript面向对象的特性
  7. Github图片加速心得
  8. asio c++20 协程在windows下和linux下设定
  9. Bailian4136 矩形分割【差分】
  10. C++访问WebService
  11. element-UI table自定义表头
  12. Objective-C Runtime 运行时之一:类与对象
  13. Python词频统计的3种方法
  14. css城市列表,js 获取全国城市列表方法
  15. VC++农历与公历转换
  16. datetime处理日期时间
  17. unity ar vr_学习在Unity中创建AR和VR应用
  18. scala中match使用的坑Scala.matchError:(of class java.lang.String)
  19. mvc html禁用文本框,如何在MVC htmlAttribute中設置禁用
  20. java唯一订单号_java高并发下唯一订单号生成器【16位数字订单号】

热门文章

  1. Java使用MyEclipse构建webService简单案例
  2. Android音频底层调试-基于tinyalsa
  3. 性能测试培训:定位jvm耗时函数
  4. Kotlin 喧嚣过后,谈谈 Java 程序员未来的出路
  5. vGPU作为主流平台的进化之路
  6. SQL server Cannot find one or more
  7. 使用Android Studio向GitHub提交代码
  8. 前台特效(9)无限极分类折叠菜单
  9. IIS中WEB服务器的日志存放到SQL Server 2005中
  10. 第十一章 “她”值多少钱