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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 52Pig 中级黑马   /  2014-3-26 19:15  /  2143 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张孝祥老师在讲解交通灯管理系统时,有提到面向接口编程:
  1. //不用ArrayList的原因是面向接口编程
  2.         private List<String> vechicles = new ArrayList<String>();
复制代码

求解释,面向接口编程是什么意思?具体应用场景,以及注意事项分别是什么。(请说的详细些,谢谢)

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

倒序浏览
面向接口编程就是在编译的时候不确定具体子类的类型,运行时再确定类型。。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
就是说使用多态性的特性。
回复 使用道具 举报
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中)
,而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
  

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
       首先,对于private List<String> vehicles = new ArrayList<String>();这句话的解释是我们不仅new一个ArrayList集合,还可以new一个LinkedList集合。而它们都实现了List接口中设计好的方法。
       其实,面向接口编程在框架中用的比较多,也就是在做项目的时候我们对外提供的是一些一些接口,主要包括设计的有哪些功能,交给客户去看是否完善。而具体的实现由子类来实现,这部分代码细节不需要提供给客户,即使提供客户也看不懂是不是。这就是所谓的“设计与实现相分离”,以后修改也比较方便。
举个例子,
  1. package com.bookshop.Service;

  2. import java.util.List;

  3. import com.bookshop.Model.Book;
  4. /**
  5. * @author jzz
  6. */

  7. /** 图书管理业务逻辑接口 */
  8. public interface BookService {
  9.         /** 浏览所有图书 */
  10.         public List<Book> browseBook();       
  11.         /** 浏览某页图书 */
  12.         public List<Book> browseBook(int pageNo,int pageSize);
  13.         /** 统计图书总数 */
  14.         public int countBook();               
  15.         /** 装载指定的图书 */       
  16.         public Book loadBook(Integer id);       
  17.         /** 删除指定的图书 */       
  18.         public boolean delBook(Integer id);       
  19.         /** 新增或修改图书 */
  20.         public boolean saveOrUpdateBook(Book book);
  21. }
复制代码
  1. package com.bookshop.ServiceImpl;

  2. import java.util.List;

  3. import com.bookshop.Dao.BaseDAO;
  4. import com.bookshop.Model.Book;
  5. import com.bookshop.Service.BookService;

  6. /** 图书管理业务逻辑接口实现 */
  7. public class BookServiceImpl implements BookService {
  8.         /** 通过依赖注入DAO组件实例 */
  9.         BaseDAO dao;

  10.         /** 新增或修改图书 */       
  11.         public boolean saveOrUpdateBook(Book Book){
  12.                 boolean status = false;
  13.                 try{
  14.                         dao.saveOrUpdate(Book);
  15.                         status = true;
  16.                 }catch(Exception ex){
  17.                         ex.printStackTrace();
  18.                 }       
  19.                 return status;
  20.         }

  21.         /** 浏览所有图书 */
  22.         @SuppressWarnings("unchecked")
  23.         public List<Book> browseBook(){
  24.                 return dao.listAll("Book");
  25.         }
  26.        
  27.         /** 浏览某页图书 */
  28.         @SuppressWarnings("unchecked")
  29.         public List<Book> browseBook(int pageNo,int pageSize){
  30.                 return dao.listAll("Book",pageNo,pageSize);
  31.         }       
  32.        
  33.         /** 统计图书总数 */
  34.         public int countBook() {
  35.                 return dao.countAll("Book");
  36.         }       
  37.        
  38.         /** 删除指定的图书 */
  39.         public boolean delBook(Integer id){
  40.                 boolean status = false;
  41.                 try{
  42.                         dao.delById(Book.class, id);
  43.                         status = true;
  44.                 }catch(Exception ex){
  45.                         ex.printStackTrace();
  46.                 }       
  47.                 return status;
  48.         }

  49.         /** 装载指定的图书 */
  50.         public Book loadBook(Integer id){
  51.                 return (Book)dao.loadById(Book.class, id);
  52.         }       

  53.         public BaseDAO getDao() {
  54.                 return dao;
  55.         }

  56.         public void setDao(BaseDAO dao) {
  57.                 this.dao = dao;
  58.         }
  59. }
复制代码

        对于以上的例子,如果我们后期客户需求改了,他想把不同作者但同名的书全删掉,那么你只需在接口中再增加一个按照图书名称删除指定图书的方法,就不用修改上面的按照id删除图书的方法,子类也不会跟着变动。使得程序之间的耦合性降低,便于大型项目的操作。
回复 使用道具 举报
蒋珍珍 发表于 2014-3-31 16:57
首先,对于private List vehicles = new ArrayList();这句话的解释是我们不仅new一个ArrayList集合 ...

老蒋同学真认真啊、赞一个。向你学习。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马