黑马程序员技术交流社区
标题:
面向接口编程
[打印本页]
作者:
52Pig
时间:
2014-3-26 19:15
标题:
面向接口编程
张孝祥老师在讲解交通灯管理系统时,有提到面向接口编程:
//不用ArrayList的原因是面向接口编程
private List<String> vechicles = new ArrayList<String>();
复制代码
求解释,面向接口编程是什么意思?具体应用场景,以及注意事项分别是什么。(请说的详细些,谢谢)
作者:
haixian
时间:
2014-3-26 22:14
面向接口编程就是在编译的时候不确定具体子类的类型,运行时再确定类型。。
作者:
向阳泪无痕
时间:
2014-3-26 23:08
就是说使用多态性的特性。
作者:
Saner
时间:
2014-3-27 10:22
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中)
,而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
作者:
蒋珍珍
时间:
2014-3-31 16:57
首先,对于private List<String> vehicles = new ArrayList<String>();这句话的解释是我们不仅new一个ArrayList集合,还可以new一个LinkedList集合。而它们都实现了List接口中设计好的方法。
其实,面向接口编程在框架中用的比较多,也就是在做项目的时候我们对外提供的是一些一些接口,主要包括设计的有哪些功能,交给客户去看是否完善。而具体的实现由子类来实现,这部分代码细节不需要提供给客户,即使提供客户也看不懂是不是。这就是所谓的“设计与实现相分离”,以后修改也比较方便。
举个例子,
package com.bookshop.Service;
import java.util.List;
import com.bookshop.Model.Book;
/**
* @author jzz
*/
/** 图书管理业务逻辑接口 */
public interface BookService {
/** 浏览所有图书 */
public List<Book> browseBook();
/** 浏览某页图书 */
public List<Book> browseBook(int pageNo,int pageSize);
/** 统计图书总数 */
public int countBook();
/** 装载指定的图书 */
public Book loadBook(Integer id);
/** 删除指定的图书 */
public boolean delBook(Integer id);
/** 新增或修改图书 */
public boolean saveOrUpdateBook(Book book);
}
复制代码
package com.bookshop.ServiceImpl;
import java.util.List;
import com.bookshop.Dao.BaseDAO;
import com.bookshop.Model.Book;
import com.bookshop.Service.BookService;
/** 图书管理业务逻辑接口实现 */
public class BookServiceImpl implements BookService {
/** 通过依赖注入DAO组件实例 */
BaseDAO dao;
/** 新增或修改图书 */
public boolean saveOrUpdateBook(Book Book){
boolean status = false;
try{
dao.saveOrUpdate(Book);
status = true;
}catch(Exception ex){
ex.printStackTrace();
}
return status;
}
/** 浏览所有图书 */
@SuppressWarnings("unchecked")
public List<Book> browseBook(){
return dao.listAll("Book");
}
/** 浏览某页图书 */
@SuppressWarnings("unchecked")
public List<Book> browseBook(int pageNo,int pageSize){
return dao.listAll("Book",pageNo,pageSize);
}
/** 统计图书总数 */
public int countBook() {
return dao.countAll("Book");
}
/** 删除指定的图书 */
public boolean delBook(Integer id){
boolean status = false;
try{
dao.delById(Book.class, id);
status = true;
}catch(Exception ex){
ex.printStackTrace();
}
return status;
}
/** 装载指定的图书 */
public Book loadBook(Integer id){
return (Book)dao.loadById(Book.class, id);
}
public BaseDAO getDao() {
return dao;
}
public void setDao(BaseDAO dao) {
this.dao = dao;
}
}
复制代码
对于以上的例子,如果我们后期客户需求改了,他想把不同作者但同名的书全删掉,那么你只需在接口中再增加一个按照图书名称删除指定图书的方法,就不用修改上面的按照id删除图书的方法,子类也不会跟着变动。使得程序之间的耦合性降低,便于大型项目的操作。
作者:
52Pig
时间:
2014-5-11 13:05
蒋珍珍 发表于 2014-3-31 16:57
首先,对于private List vehicles = new ArrayList();这句话的解释是我们不仅new一个ArrayList集合 ...
老蒋同学真认真啊、赞一个。向你学习。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2