A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 吴扬 中级黑马   /  2012-7-8 20:17  /  1584 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张老师的基础加强第27集中,需要用一个文件输入流对象读取一个config.properties的配置文件,老师刚开始是用的字节输入流FileInputStream,随后又把它改成了InputStream,
InputStream ips =new FileInputStream("config.properties");
接着老师就说要尽量面向父类或接口编程。这样做的话就有可能就会造成类型强制转换的操作。为什么说要尽量面向父类或接口编程呢?这样做有什么好处吗?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

4 个回复

倒序浏览
面向接口编程主要体现了多态的好处就好像子类继承父类,用爷爷类创建一个引用指向孙子对象,调用方法时自动识别
1,在多态中非静态成员函数的特点:
在编译的时候,参阅引用型变量所属类中是否有调用方法 ,  如有,就通过 ,没有,就失败。
在运行的时候,参阅对象所属类中是否有调用方法。
即编译看左边,运行看右边
2,在多态中成员变量或者静态成员函数的特点:
无论编译还是运行都参考左边(引用型变量所属类)。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 丁二跃 于 2012-7-8 21:13 编辑

其实在那个例子中你就可以看到好处了:
这里你把ips 定义为Inputstream

    在第一种方法加载配置文件时 ips=new FileInputStream("config.properties");
     利用第二种方法时仍旧可以: ips= PropertiesTest.class.getClassLoader().getSystemResourceAsStream("config2.properties");
     同样第三种方法仍可以。

如果你把它定义成FileInputStream  那么当你修改程序时,不是还要改ips 类型吗

这里还不能体现面向接口的好处。看一下工厂模式吧,讲的很详细……看过你就知道

写了个简单的:
  1. public class Test {
  2. public static void main(String[] args) throws Exception{
  3. Meth m=MethFactory.getMeth();  //面向接口,工厂类提供实例对象。
  4. m.dis();
  5. }

  6. }

  7. //该方法用于获得 实现 接口的实例
  8. class MethFactory{
  9. static Meth getMeth()throws Exception{
  10. Properties properties=new Properties();
  11. properties.load(
  12. MethFactory.class.getClassLoader().getSystemResourceAsStream("config2.properties"));
  13. return (Meth) Class.forName((String)properties.getProperty("className")).newInstance();
  14. }
  15. }



  16. interface Meth{  //定义接口
  17. void dis();
  18. }

  19. class ImplA implements Meth{
  20. public void dis() {
  21. System.out.println("接口实现 A");
  22. }

  23. }
  24. class ImplB implements Meth{
  25. public void dis() {
  26. System.out.println("接口实现 B");
  27. }

  28. }
复制代码
配置文件:className=cn.ref.day35.ImplA

现在需要改变一种实现方式,只需要修改配置文件即可className=cn.ref.day35.ImplB  而不用去管源程序。

这就是面向接口的好处了……降低而耦合度,增加可维护性



                  
              

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
尽量面向父类或接口编程,

好处是之后想扩展功能的时候方便,不需要对原程序进行太大改动,只要再写个子类或实现接口就能有新功能。

例子:电脑主机箱,上面插口就像接口,你觉得需要增加电脑功能时就在插口上插东西,觉得不爽可以换插其他东西,而不需要对主机箱做什么改变。父类思想也类似。

希望你能理解种编程思想。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
呵呵,像J2EE中的API规范基本上都是接口,由各应用服务器来实现,比如:WebSphere按照这个接口实现自己的,WebLogic也按照这个接口实现自己的,作为开发者来说我们根本就不用去管谁是怎样实现的,只要按照J2EE的API
来写就可以了,根本用不着导入它们的实现包,实际上具体的是由它们自身完成了。

接口说白了,也就是定死了一个框,具体的是糊红纸还是糊黑纸我们都用不着去管的,我们只要知道它是个框,提供
了哪些方法就够了。

举个简单的JDBC的例子吧,比如有个BaseDao接口,现在有MySQLDao实现了一个(我们可以把具体的实现类配在配置
文件中,再通过反射进行实例化),也就类似这样的:

BaseDao dao = (BaseDao)(Class.forName(Config.getDaoName()).newInstance());

其中Config.getDaoName()可以获得配置文件中的配置,比如是:com.bao.dao.impl.MySQLDao。

之后,那些人开始要烧钱了,要改用Oracle了,这样我们只要按BaseDao的定义,再实现一个OracleDao就可以了,
再将配置文件中的配置改为:com.bao.dao.impl.OralceDao就可以了,而在已经写好的代码中,我们可以一行不
改的进行了数据库移植,这个就是面向对象设计原则中的“开-闭原则”(对增加是开放的,对修改是封闭的)。但
这只是理论上的,现实中很难做到的。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马