java中继承用extends 实现接口用 implements

针对接口编程而不是针对实现编程

2009-01-08 10:23 zhangrun_gz | 分类:其他编程语言
老听说这句,不知道到底要怎么理解。也查了不少资料,还是难以驾驭,有高手给讲解下(越详细越好)。谢谢。
为什么都不说说针对实现编程呢?

首先你要清楚什么是接口。接口就是标准。生活中有很多接口。如水龙头水管接口、电源接口等。
现在有很多的水龙头生产商,在采用接口之前,厂商要同时提供水龙头和下水管,它们是一体的,不能变更。同时也只适用于他的这一种产品。而有了接口之后,厂商就就不用去管它的下水管如何设计了,只用安装接口标准来生产水龙头,完成后直接接到下水管上就可以了。这就是面向接口。
这样的话你的下水管就可以使用所有的符合下水管标准的水龙头,而不是之前的一种水龙头。而且更换水龙头更加的方便。 放在程序中说就是。如果一个类不能确定它最后的类型,就是说不知道它以后要被实现成什么样,就可以采用面向接口的编程。所有需要这个类的地方都设成一个接口,而让这个类继承这个接口。后期要更改的时候只用继承这个接口就可以了。
如 你的方法是 public void doSomething(IServer ser);参数是一个接口
public interface IServer{
//something
}
然后你就可以写很多不同的类来实现这个接口
如public class a implements IServer{
//something
}
public class b implements IServer{
//something
} 然后你的方法就可以这样调用了。 doSomething(a);
doSomething(b);
这样都是可以的~不知道你理解没~
 
倒数第3句话怎么理解:"从某个角度却反而成了它的弱点."
从哪个角度说 ?弱点是什么 ?


你接着往后读

因为这个设计如此明显,你可能因此 .....

这不就是它的弱点么?

换句话说,你直接就像到用虚函数,别的方案就没管了,或许别的方案才是更合适的方案呢


引用 楼主   的回复:

倒数第3句话怎么理解:"从某个角度却反而成了它的弱点."
从哪个角度说 ?弱点是什么 ?

我在实际工作中,这个确实深有体会,有时候确实继承不是好的设计。不管继承还是其他设计其实是为了封闭变化。楼主这里,就是不同的游戏角色有不同的算法。使用oo思想,就是搞个虚函数。
如果游戏角色就是几种,还好,这样设计也行,如果游戏的角色非常多,几百种,各种职业的,几百个类,每个都继承实现一下基类,几百种实现中,可能好多的有
重复的,这样设计就不行了。代码重复性高,利用性不强,我想书上说的好的设计,往往指,在类中另外一种health算法的类,各种health子类再分化
计算血的算法,这样就能将不变化的的部分提取出来。
一句话,争对接口编程,不是实现 。

java中继承用extends 实现接口用 implements

ZT 针对接口编程而不是针对实现编程的更多相关文章

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

    今天在阅读<Head First设计模式>的时候,看到了这句话:"针对接口编程,而不是针对实现编程",第一次见到的时候,不太清楚作者想表达的意思,想着到后来看看实例就懂 ...

  2. 针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 某公司...打印机...(笔试中遇到的题目)

    针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求.         举个例子:某公司有一台特殊打印机,还可以使用一年,一年后可能换为另一种打印机,这两种打印机都特殊而贵. ...

  3. struts2针对mvc的框架 spring针对解耦与事务的框架

    struts2针对mvc的框架 spring针对解耦与事务的框架

  4. 设计模式之Programming to an Interface, not anImplementation 程序指向接口,而不是实现

    Class inheritance is basically just a mechanism for extending an application's functionality by reus ...

  5. python学习之flask接口开发,环境变量扩展,网络编程requests

    python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...

  6. 我面向 Google 编程,他面向薪资编程

    面试官:同学,说一说面向对象有什么好处? 神仙开发者:我觉的面向对象编程没有什么好处. 面试官:为什么(摊手.问号脸)? 神仙开发者:因为在面向对象的时候,我对象总是跟我说话,问我在淘宝上挑的衣服哪个 ...

  7. [.net 面向对象编程基础] (2) 关于面向对象编程

    [.net 面向对象编程基础]  (2)  关于面向对象编程 首先是,面向对象编程英文 Object-Oriented Programming 简称 OOP 通俗来说,就是 针对对象编程的意思 那么问 ...

  8. 学习响应式编程 Reactor (1) - 响应式编程

    响应式编程 命令式编程(Imperative Programing),是一种描述计算机所需做出的行为的编程范式.详细的命令机器怎么(How)去处理以达到想要的结果(What). 声明式编程(Decla ...

  9. 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

随机推荐

  1. Oracle 架构

  2. [转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

    局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自< ...

  3. angularJS请求参数 ajax

    1. 使用angular服务请求 app.controller('main', function($scope, $http) { $scope.fun1 = function () { $http( ...

  4. Kettle系列文章二(安装配置Kettle+SqlServer+简单的输入输出作业)

    一.下载 Kettle下载地址:https://community.hitachivantara.com/docs/DOC-1009855 下拉到DownLoad,点击红框中的链接进行下载.. 二.解 ...

  5. HttpClient 入门教程学习

    HttpClient简介 HttpClient是基于HttpCore的HTTP/1.1兼容的HTTP代理实现. 它还为客户端认证,HTTP状态管理和HTTP连接管理提供可重用组件. HttpCompo ...

  6. rabbimq之死信队列

    死信队列:DLX,dead-letter-exchange 利用dlx,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个exchange,这个exchang ...

  7. JavaScript中解决多浏览器兼容性问题的方案

    一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...

  8. LinearLayout中的android:layout_garvity的center_vertical和center_horizontal

    当LinearLayout的排列方向是 horizontal时,只有垂直方向上的对齐方式才会生效.因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对 ...

  9. Spring课程 Spring入门篇 7-2 Advice定义及实例

    1 解析 1.1 通知:after和afterreturning的区别 1.2 @RunWith 是什么? 2 代码演练 2.1 注解方式配置通知的两种方式 2.2 异常通知 2.3 非异常通知 1 ...

  10. nexus3安装

    windows环境 1.下载nexus3 2.以管理员的方式打开命令行,建议打开服务管理界面,将这个服务设置为手动,步骤是:右键我的电脑-->服务-->nexus,然后点击设置手动启动 3 ...