<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/oriented-interface-html/</link>
<title><![CDATA[理解何为面向接口编程，重新认识接口]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Tue, 24 Aug 2010 15:52:05 +0000</pubDate> 
<guid>https://www.heckjj.com/oriented-interface-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">刚开始学习java知道接口是一个类所具有的方法特征的集合，是一种逻辑上的抽象，它里面定义的方法没有方法体，主要作用就是解决了java类只能单根继承的不足。如：我们可以定义一个跑车接口SportsCar: </span><br/><textarea name="code" class="java" rows="15" cols="100">
/**
 * 定义一个跑车接口
 * 
 */
public interface SportsCar &#123;
&nbsp;&nbsp;//发动机类型：石油驱动
&nbsp;&nbsp;public void oilEngine();
&#125;
再写一个奔驰汽车类Benz,实现SportsCar接口
/**
 * 奔驰汽车
 * 
 */
public class Benz implements SportsCar &#123;

&nbsp;&nbsp;public void oilEngine() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("采用石油驱动");
&nbsp;&nbsp;&#125;

&#125;
</textarea><br/><br/><span style="font-family: 微软雅黑;"><br/>像这样我们也可以把SportsCar定义为一个类，让Benz类去继承它，也可以实现，但如果科技进步了，人类环保意识加强了，出现了绿色环保车型，即采用太阳能作为发动机，而奔驰公司也为了体现这点，给汽车装上了双引擎系统。那么再定义一个GreenCar类，让Benz去继承就不行了，因为java是单根继承，所以只能把GreenCar定义为一个接口：</span> <br/><textarea name="code" class="java" rows="15" cols="100">
/**
 * 绿色环保车接口
 *
 */
public interface GreenCar &#123;
&nbsp;&nbsp;//发动机类型:太阳能驱动
&nbsp;&nbsp;public void solarEngine();
&#125;
让Benz类同时实现这两上接口，从而使汽车具有双引擎系统的功能：
/**
 * 奔驰汽车
 *
 */
public class Benz implements SportsCar ,GreenCar&#123;
&nbsp;&nbsp;
&nbsp;&nbsp;public void oilEngine() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("采用石油驱动");
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;
&nbsp;&nbsp;public void solarEngine() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("采用太阳能驱动");
&nbsp;&nbsp;&#125;

&#125;
</textarea><br/><span style="font-family: 微软雅黑;"><br/>通过接口提供了关联以及方法调用上的可插入性，当下层需要改变时，只要接口及接口功能不变，则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉，就像我们将一个60G硬盘换成一个160G的硬盘，计算机其他地方不用做任何改动，而是把原硬盘拔下来、新硬盘插上就行了，因为计算机其他部分不依赖具体硬盘，而只依赖一个IDE接口，只要硬盘实现了这个接口，就可以替换上去。 <br/><br/>&nbsp;&nbsp; 虽然接口的好处是毋庸置疑的，可是自己在实际项目开发过程中很少体现面向接口的编程思想，很多时候自己在接口里面定义了一个方法，马上就把想到怎样去实现它，其实自己的注意力一直在实现层，有时候觉得接口这玩意儿有个屁用。其实这是自己的误区，没有真正从一个高度理解接口的内涵，面向接口编程体现的是一种设计，如果一个项目没有好的设计，就算成功了它的扩展性也不好。 <br/><br/>&nbsp;&nbsp; 那么面向接口编程到底有什么好处呢？ <br/>&nbsp;&nbsp; 1.使用接口编程，易于程序的扩展 <br/>&nbsp;&nbsp; 理解面向接口编程一个很好的实例就是java自带的数据库连接接口的定义，假如我们现在要写一个连接数据库的类给用户使用，一般的解决办法是给每个数据库写一个类，然后根据用户使用的数据库类型确定使用具体的类，这样的话必然造成代码的重复，另外也不利于系统的扩展，因为你根本不知道用户使用什么样的数据库，可能是MySQL，可能是Oracle，大家都知道eclipse它可以连接很多数据库，只要你把相应的驱动包加进来，就可以实现连接多种数据库了,想一想这是为什么，因为java里面把Connection定义为了接口，接口是什么，在这里其实就一个标准了，真正的实现其实是交给了数据库的开发方，这个实现类中实现了Connection接口，不信看驱动包中<br/>Connection类的源码： <br/>public class Connection extends ConnectionProperties implements <br/>java.sql.Connection <br/>&#123; <br/><br/>&#125;<br/>那么不管以后还出现什么样的数据库，只要它实现了Sun公司制定的个接口就都可以连接的上，这样让eclipse得到的广泛的应用 <br/>&nbsp;&nbsp; 2.降低了程序之间的耦合性 <br/>&nbsp;&nbsp; 大家玩过游戏的都知道，很多游戏从它发布开始，就会每隔一段时间进行更新，有时还会增加游戏角色等，使玩家时刻保持新鲜感。那么游戏里面肯定是定义了很多的接口，我增加一个角色只要实现这个角色的接口就可以了，只要通过编译后，就可以把它加到服务器中去就新增了一角色，你想要是没有接口，这游戏还能玩的下去吗？ <br/>&nbsp;&nbsp; 3.便于项目的模块化管理，不形成编译的依赖性 <br/>&nbsp;&nbsp; 因为现在都讲究团队合作精神，做项目也是一样，很多项目都不可能由你一个人来完成，肯定是很多人分工合作，分模块的来完成工作，每个模块都是独立的，尤其到项目快完成的时候并不要把所有模块组合起来编译一把，然后再运行，只要每个独立模块编译通过就OK了。 <br/>&nbsp;&nbsp; 虽然自己已经感觉到了不少面向接口编程的好处，但这还只是自己的心得，离真正把这种思想贯彻到编码设计中感觉还是有不少距离，这是一种设计思想，思想是最难的把握的， 对于原理性的东西还要自己好好去琢磨，有自己真正的见解才是真的懂了。</span>&nbsp;&nbsp;<br/>Tags - <a href="https://www.heckjj.com/tags/%25E6%258E%25A5%25E5%258F%25A3%25E7%25BC%2596%25E7%25A8%258B/" rel="tag">接口编程</a> , <a href="https://www.heckjj.com/tags/%25E6%258E%25A5%25E5%258F%25A3/" rel="tag">接口</a> , <a href="https://www.heckjj.com/tags/interface/" rel="tag">interface</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/oriented-interface-html/#blogcomment</link>
<title><![CDATA[[评论] 理解何为面向接口编程，重新认识接口]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/oriented-interface-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>