java中解耦合_简单分析程序中耦合和解耦合
什么是程序的耦合
耦合性(Coupling),也叫耦合度,是對模塊間關聯程度的度量。耦合的強弱取決于模塊間接口的復雜性、調用模塊的方式以及通過界面傳送數據的多少。模塊間的耦合度是指模塊之間的依賴關系,包括控制關系、調用關系、數據傳遞關系。模塊間聯系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立性)。耦合性存在于各個領域,而非軟件設計中獨有的,但是我們只討論軟件工程中的耦合。在軟件工程中,耦合指的就是就是對象之間的依賴性。對象之間的耦合越高,維護成本越高。因此對象的設計應使類和構件之間的耦合最小。軟件設計中通常用耦合度和內聚度作為衡量模塊獨立程度的標準。劃分模塊的一個準則就是高內聚低耦合。
簡單來說就是,減少模塊之間的依賴性,提高程序的獨立性
通常,我們在一個程序中,調用另外一個程序的方法,我們一般都會想到用new這個關鍵詞,在學習Spring之前,我們在ServiceImpl中調用DAO中的方法,我們一般會這樣寫
private IAccountDAO dao = new IAccountDAOImpl();
這樣的代碼寫多了之后會大大的增加程序的耦合度,沒有遵循開發中的高內聚,低耦合的開發思想,極大的增加了代碼的維護難度,非常不利于代碼的維護和調式,所以我們想到在Java發射中我們學過通過newInstance() 對象來獲得實例,所以我們可以,通過反射來降低代碼之間的耦合度。
但是,要想通過newInstance() 來獲取對象的實例就必須得到該類的全限定類名,所以,我們考慮用XML或者是Properties,但是由于properties較為簡單,所以此處我們選用properties。
代碼如下
//IAccountDAO.java
public interface IAccountDAO {
void saveAccount();
}
//IAccountDAOImpl.java
public class IAccountDAOImpl implements IAccountDAO {
@Override
public void saveAccount() {
System.out.println("賬戶保存成功");
}
}
//IAccountService.java
public interface IAccountService {
void saveAccount();
}
//IAccountServiceImpl.java
public class IAccountServiceImpl implements IAccountService {
//private IAccountDAO dao = new IAccountDAOImpl();
IAccountDAO dao = (IAccountDAO) BeanFactory.getBean("IAccountDAO");
@Override
public void saveAccount() {
dao.saveAccount();
System.out.println(i);
}
}
//BeanFactory.java
public class BeanFactory {
//定義一個Properties對象
private static Properties properties;
static {
try {
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
properties = new Properties();
properties.load(in);
} catch (IOException e) {
throw new ExceptionInInitializerError("初始化properties異常");
}
}
public static Object getBean(String beanName) {
Object bean = null;
try {
//通過beanName獲取該類的全限定類名
String property = properties.getProperty(beanName);
//實例化properties
bean = Class.forName(property).newInstance();//每次都會調用默認構造函數創建對象
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return bean;
}
}
//Client.java
public class Client {
public static void main(String[] args) {
//IAccountService service = new IAccountServiceImpl();
IAccountService service = (IAccountService) BeanFactory.getBean("IAccountService");
service.saveAccount();
}
}
#bean.properties文件
#需要一個唯一標識來配置我們的Service和Dao,配置內容:唯一標識=全限定類名(key=value)
IAccountService=com.toulan.service.impl.IAccountServiceImpl
IAccountDAO=com.toulan.dao.impl.IAccountDAOImpl
運行結果
我們發現我們并沒有像以前寫的那樣通篇全是通過new 來實例化對象,減少了代碼之間的耦合度。
現在我們將代碼進行少許的修改,然后再次運行,修改的代碼如下
//IAccountServiceImpl.java
public class IAccountServiceImpl implements IAccountService {
//private IAccountDAO dao = new IAccountDAOImpl();
IAccountDAO dao = (IAccountDAO) BeanFactory.getBean("IAccountDAO");
public int i = 1;
@Override
public void saveAccount() {
dao.saveAccount();
System.out.println(i);
i++;
}
}
//Client.java
public class Client {
public static void main(String[] args) {
//IAccountService service = new IAccountServiceImpl();
IAccountService service = null;
for (int i=0;i<5;i++) {
service = (IAccountService) BeanFactory.getBean("IAccountService");
System.out.println(service);
service.saveAccount();
}
}
}
運行結果
通過運行結果我們發現,雖然我們在for循環里面什么也沒做,但是結果中我們發現打印出來的對象都不一樣,但是我們期望它是一樣的,不一樣的原因是因為每次調用newInstance() 這個方法它都會執行該類的無參構造器,從而來創建一個新的對象。其實我們不太需要每次都來創建一個對象,而每次創建一個新的對象,對內存的消耗也是不小的,所以我們可以考慮使用單例模式,但是newInstance() 每次調用都會創建一個新的對象,所以如果我們的同一對象使用多次,我們可以考慮只newInstance 一次,但是如果我們創建一個對象而長時間不去使用它,那么就會因為Java的垃圾回收機制導致該對象被回收,導致我們下次使用的時候對象已經被回收而導致無法使用,所以,我們要將實例化的對象裝入一個新的容器之中去,那么,我們就可以定義一個Map,用于存放相對應的鍵值,所以代碼修改如下:
//BeanFactory.java
public class BeanFactory {
//定義一個Properties對象
private static Properties props;
//定義一個Map,用于存放我們要創建的對象。我們把它稱之為容器
private static Map beans;
//使用靜態代碼塊為Properties對象賦值
static {
try {
//實例化對象
props = new Properties();
//獲取properties文件的流對象
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
//實例化容器
beans = new HashMap();
//取出配置文件中所有的Key
Enumeration keys = props.keys();
//遍歷枚舉
while (keys.hasMoreElements()){
//取出每個Key
String key = keys.nextElement().toString();
//根據key獲取value
String beanPath = props.getProperty(key);
//反射創建對象
Object value = Class.forName(beanPath).newInstance();
//把key和value存入容器中
beans.put(key,value);
}
}catch(Exception e){
throw new ExceptionInInitializerError("初始化properties失敗!");
}
}
/**
* 根據bean的名稱獲取對象
* @param beanName
* @return
*/
public static Object getBean(String beanName) {
return beans.get(beanName);
}
}
運行結果
LOL_toulan
發布了37 篇原創文章 · 獲贊 20 · 訪問量 7824
私信
關注
標簽:和解,對象,分析程序,public,IAccountService,new,耦合,IAccountDAO,properties
來源: https://blog.csdn.net/LOL_toulan/article/details/104135224
總結
以上是生活随笔為你收集整理的java中解耦合_简单分析程序中耦合和解耦合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 致远项目管理SPM系统案例:中天金融集团
- 下一篇: 国家职业资格:计算机网络管理员