日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品首页 | 成人精品视频一区二区三区尤物 | 婷婷射 | 四虎少妇做爰免费视频网站四 | www日本www | 911毛片| 精品欧美久久久 | 国产免费一区二区三区在线观看 | 免费看a级片 | 欧美超碰在线 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 亚洲一级视频在线观看 | 一区二区视频在线免费观看 | 国产操| 亚洲激情四射 | 久久精品国产精品亚洲色婷婷 | 99久久人妻无码精品系列 | 欧美丰满少妇 | 国产精品一区二区入口九绯色 | 精品人妻一区二区免费视频 | 日韩大片免费在线观看 | www.玖玖玖| 国产传媒第一页 | 中文字幕乱码视频 | 午夜影院福利社 | 福利片在线播放 | 国产强被迫伦姧在线观看无码 | 毛片久久久久久久 | 欧美一级爱爱视频 | 91社区在线播放 | 欧美特级黄色大片 | 三级国产在线 | 国产一二三精品 | 一级视频在线观看 | 欧洲精品久久久久毛片完整版 | 奇米网久久 | 成人aⅴ视频 | 九九精品国产 | 久久草网站| 99久久99九九99九九九 | 国产jizz18女人高潮 | 中国免费观看的视频 | 中文字幕一区二区三区人妻四季 | 精品一区二区三区视频日产 | 免费九九视频 | 久久男人天堂 | 特黄三级又爽又粗又大 | 国精产品一区一区三区视频 | 偷拍第一页 | 六月久久 | 久操视频在线 | 午夜精品视频一区二区三区在线看 | 人妻一区二区三区免费 | aaa一级黄色片 | 最新毛片基地 | 伊朗做爰xxxⅹ性视频 | 国产麻豆剧果冻传媒白晶晶 | av2014天堂| 日韩精品一区二区免费视频 | 日本一区二区三区精品视频 | 亚洲欧美日韩精品色xxx | 日日摸日日碰夜夜爽av | 欧美精品国产一区 | 99精品久久久久久久 | 一区二区欧美在线观看 | 国产欧美日韩精品一区 | 人妻中文字幕一区二区三区 | 两根大肉大捧一进一出好爽视频 | 亚洲一二三四区 | 成人午夜视频在线 | 中文字幕不卡 | 依依激情网 | 国产精品第5页 | 天堂中文在线看 | 黄色激情在线观看 | 成人动作片 | 牛牛影视一区二区 | julia一区二区中文久久97 | 色婷婷视频在线观看 | 亚洲乱码一区二区三区 | 亚洲23p | 特黄特色免费视频 | 久草不卡 | 成人日韩在线观看 | 中文字幕一区二区三区四区视频 | 久久精品福利视频 | 激情第四色 | 国产欧美精品aaaaaa片 | 国产丝袜在线 | 麻豆精品视频免费观看 | 可以直接看的无码av | 优优色影院 | 国产农村妇女aaaaa视频 | 亚洲人成色777777老人头 | 天堂中文在线视频 | 国产亚洲在线观看 | 一本一道无码中文字幕精品热 | 蜜桃av网站 | 欧美性猛交69 |