黑马程序员技术交流社区

标题: 面向父类或接口编程 [打印本页]

作者: 吴扬    时间: 2012-7-8 20:17
标题: 面向父类或接口编程
张老师的基础加强第27集中,需要用一个文件输入流对象读取一个config.properties的配置文件,老师刚开始是用的字节输入流FileInputStream,随后又把它改成了InputStream,
InputStream ips =new FileInputStream("config.properties");
接着老师就说要尽量面向父类或接口编程。这样做的话就有可能就会造成类型强制转换的操作。为什么说要尽量面向父类或接口编程呢?这样做有什么好处吗?
作者: 万宝东    时间: 2012-7-8 20:33
面向接口编程主要体现了多态的好处就好像子类继承父类,用爷爷类创建一个引用指向孙子对象,调用方法时自动识别
1,在多态中非静态成员函数的特点:
在编译的时候,参阅引用型变量所属类中是否有调用方法 ,  如有,就通过 ,没有,就失败。
在运行的时候,参阅对象所属类中是否有调用方法。
即编译看左边,运行看右边
2,在多态中成员变量或者静态成员函数的特点:
无论编译还是运行都参考左边(引用型变量所属类)。
作者: 丁二跃    时间: 2012-7-8 20:47
本帖最后由 丁二跃 于 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  而不用去管源程序。

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



                  
              
作者: 党巾水    时间: 2012-7-10 15:27
尽量面向父类或接口编程,

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

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

希望你能理解种编程思想。
作者: 耿立刚    时间: 2012-7-10 17:14
呵呵,像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就可以了,而在已经写好的代码中,我们可以一行不
改的进行了数据库移植,这个就是面向对象设计原则中的“开-闭原则”(对增加是开放的,对修改是封闭的)。但
这只是理论上的,现实中很难做到的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2