日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中解耦合_简单分析程序中耦合和解耦合

發(fā)布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中解耦合_简单分析程序中耦合和解耦合 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是程序的耦合

耦合性(Coupling),也叫耦合度,是對模塊間關(guān)聯(lián)程度的度量。耦合的強弱取決于模塊間接口的復(fù)雜性、調(diào)用模塊的方式以及通過界面?zhèn)魉蛿?shù)據(jù)的多少。模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立性)。耦合性存在于各個領(lǐng)域,而非軟件設(shè)計中獨有的,但是我們只討論軟件工程中的耦合。在軟件工程中,耦合指的就是就是對象之間的依賴性。對象之間的耦合越高,維護成本越高。因此對象的設(shè)計應(yīng)使類和構(gòu)件之間的耦合最小。軟件設(shè)計中通常用耦合度和內(nèi)聚度作為衡量模塊獨立程度的標(biāo)準(zhǔn)。劃分模塊的一個準(zhǔn)則就是高內(nèi)聚低耦合。

簡單來說就是,減少模塊之間的依賴性,提高程序的獨立性

通常,我們在一個程序中,調(diào)用另外一個程序的方法,我們一般都會想到用new這個關(guān)鍵詞,在學(xué)習(xí)Spring之前,我們在ServiceImpl中調(diào)用DAO中的方法,我們一般會這樣寫

private IAccountDAO dao = new IAccountDAOImpl();

這樣的代碼寫多了之后會大大的增加程序的耦合度,沒有遵循開發(fā)中的高內(nèi)聚,低耦合的開發(fā)思想,極大的增加了代碼的維護難度,非常不利于代碼的維護和調(diào)式,所以我們想到在Java發(fā)射中我們學(xué)過通過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();//每次都會調(diào)用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對象

} 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文件

#需要一個唯一標(biāo)識來配置我們的Service和Dao,配置內(nèi)容:唯一標(biāo)識=全限定類名(key=value)

IAccountService=com.toulan.service.impl.IAccountServiceImpl

IAccountDAO=com.toulan.dao.impl.IAccountDAOImpl

運行結(jié)果

我們發(fā)現(xiàn)我們并沒有像以前寫的那樣通篇全是通過new 來實例化對象,減少了代碼之間的耦合度。

現(xiàn)在我們將代碼進行少許的修改,然后再次運行,修改的代碼如下

//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();

}

}

}

運行結(jié)果

通過運行結(jié)果我們發(fā)現(xiàn),雖然我們在for循環(huán)里面什么也沒做,但是結(jié)果中我們發(fā)現(xiàn)打印出來的對象都不一樣,但是我們期望它是一樣的,不一樣的原因是因為每次調(diào)用newInstance() 這個方法它都會執(zhí)行該類的無參構(gòu)造器,從而來創(chuàng)建一個新的對象。其實我們不太需要每次都來創(chuàng)建一個對象,而每次創(chuàng)建一個新的對象,對內(nèi)存的消耗也是不小的,所以我們可以考慮使用單例模式,但是newInstance() 每次調(diào)用都會創(chuàng)建一個新的對象,所以如果我們的同一對象使用多次,我們可以考慮只newInstance 一次,但是如果我們創(chuàng)建一個對象而長時間不去使用它,那么就會因為Java的垃圾回收機制導(dǎo)致該對象被回收,導(dǎo)致我們下次使用的時候?qū)ο笠呀?jīng)被回收而導(dǎo)致無法使用,所以,我們要將實例化的對象裝入一個新的容器之中去,那么,我們就可以定義一個Map,用于存放相對應(yīng)的鍵值,所以代碼修改如下:

//BeanFactory.java

public class BeanFactory {

//定義一個Properties對象

private static Properties props;

//定義一個Map,用于存放我們要創(chuàng)建的對象。我們把它稱之為容器

private static Map beans;

//使用靜態(tài)代碼塊為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();

//根據(jù)key獲取value

String beanPath = props.getProperty(key);

//反射創(chuàng)建對象

Object value = Class.forName(beanPath).newInstance();

//把key和value存入容器中

beans.put(key,value);

}

}catch(Exception e){

throw new ExceptionInInitializerError("初始化properties失敗!");

}

}

/**

* 根據(jù)bean的名稱獲取對象

* @param beanName

* @return

*/

public static Object getBean(String beanName) {

return beans.get(beanName);

}

}

運行結(jié)果

LOL_toulan

發(fā)布了37 篇原創(chuàng)文章 · 獲贊 20 · 訪問量 7824

私信

關(guān)注

標(biāo)簽:和解,對象,分析程序,public,IAccountService,new,耦合,IAccountDAO,properties

來源: https://blog.csdn.net/LOL_toulan/article/details/104135224

總結(jié)

以上是生活随笔為你收集整理的java中解耦合_简单分析程序中耦合和解耦合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。