一.耦合和解耦
耦合:
◇ 所謂的耦合指的是在軟件開發中,在層與層之間產生了某種緊密的關係,這種關係可能會致使,在咱們修改或者是替換某一層時會影響其餘的層,像這種狀況咱們就稱之爲層與層之間產生了耦合。
◇ 因爲耦合(層與層之間的緊密關係)可能會致使咱們在修改某一層時影響到其餘的層,而這嚴重違反了咱們對軟件進行分層的最初設想 -- 軟件各層之間應該相互獨立、互不干擾,在修改或者是替換某一層時,應該作到不 影響其餘層。
解耦:
◇ 去除耦合的過程,稱爲解耦。
◇ 首先應該在開發程序時保證不要胡亂傳遞只屬於某一層特有的對象或跨層調用只屬於某一層特有的方法,從而避免產生沒必要要的耦合。可是不管如何當心,層與層之間最終仍是會有關係,對於這種沒法避免的耦合,咱們應 該想辦法管理起來。
解耦方式: 接口+配置文件+工廠spa
二.案例:對象
1.1.案例: 使用 接口+配置文件+工廠 進行EasyMall項目中層與層之間的解耦
-----------------------------------------
1.1.引入接口
將UserDao和UserService類改成UserDaoImpl和UserServiceImpl類, 建立UserDao和UserService接口, 並讓UserDaoImpl和UserServiceImpl分別實現UserDao和UserService接口
-----------------------------------------
1.2.引入配置文件
建立conf.properties文件, 添加以下配置:
UserDao=cn.tedu.dao.UserDaoImpl
UserService=cn.tedu.service.UserServiceImpl接口
-----------------------------------------開發
2.引入工廠(v3)
public class BasicFactory {
private static BasicFactory factory = new BasicFactory();
//單例模式
private BasicFactory(){}
//返回工廠實例
public static BasicFactory getFactory(){
return factory;
}
//根據配置文件中的配置項生產UserDao實例
public <T> T getInstance(Class<T> clazz){//返回類型及傳入類型是核心點
try {
String className = PropUtils.getValue(clazz.getSimpleName());//類的全限定名
Class clz = Class.forName(className);
return (T)clz.newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
-----------------------------------------
2.1.修改UserServiceImpl, 經過BasicFactory獲取UserDao實例:
private UserDao dao = BasicFactory.getFactory().getInstance(UserDao.class);
-----------------------------------------
2.2.修改各種Servlet, 經過BasicFactory獲取UserService實例:
private UserService service = BasicFactory.getFactory().getInstance(UserService.class);get