02-耦合和解耦
目錄
- 一、程序的耦合
- 1.耦合:
- 2.解耦:
- 3.實(shí)際開發(fā)中:
- 4.解耦思路:
- 5.例子:耦合性很強(qiáng)
- Ⅰdao
- Ⅱ service
- Ⅲ主函數(shù)
- 6.解耦
- Ⅰ思路
- Ⅱ 創(chuàng)建工廠類
- Ⅲ創(chuàng)建配置文件
- Ⅳ修改 AccountServiceImpl
- Ⅴ主函數(shù)
- Ⅵ總結(jié)
- 7.分析工廠模式中的問題并改造
- Ⅰ 修改下主函數(shù)
- Ⅱ、修改為單例模式
一、程序的耦合
1.耦合:
程序間的依賴關(guān)系
包括:
類之間的依賴。
方法間的依賴。
2.解耦:
降低程序間的依賴關(guān)系。
3.實(shí)際開發(fā)中:
應(yīng)該做到編譯期不依賴,運(yùn)行時(shí)才依賴。
4.解耦思路:
5.例子:耦合性很強(qiáng)
Ⅰdao
public interface IAccountDao {/*** 模擬保護(hù)賬戶*/void saveAccount(); }實(shí)現(xiàn)類
public class AccountDaoImpl implements IAccountDao {public void saveAccount() {System.out.println("保存了");} }Ⅱ service
public interface IAccountService {/*** 模擬保護(hù)賬戶*/void saveAccount(); }實(shí)現(xiàn)類
這里有著很強(qiáng)的依賴關(guān)系
public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao=new AccountDaoImpl();public void saveAccount() {accountDao.saveAccount();} }Ⅲ主函數(shù)
public class Client {public static void main(String[] args) {IAccountService as=new AccountServiceImpl();as.saveAccount();} }6.解耦
Ⅰ思路
使用工廠模式解耦
一個(gè)創(chuàng)建Bean對(duì)象的工廠
Bean:在計(jì)算機(jī)英語中,有可重用組件的含義。
JavaBean: java語言編寫的可重用組件* javabean > 實(shí)體類 javabean不等于實(shí)體類,要遠(yuǎn)大于實(shí)體類
第一個(gè):需要一個(gè)配置文件來配置service和dao,配置的內(nèi)容:唯一標(biāo)識(shí)=全限定類名(key=value)
第二個(gè):通過讀取配置文件中配置內(nèi)容,反射創(chuàng)建對(duì)象** 配置
文件可以是 xml 也可以是 properties
Ⅱ 創(chuàng)建工廠類
/*** 描述:* 〈一個(gè)創(chuàng)建Bean對(duì)象的工廠〉* Bean:在計(jì)算機(jī)英語中,有可重用組件的含義。* JavaBean: java語言編寫的可重用組件* javabean > 實(shí)體類 javabean不等于實(shí)體類,要遠(yuǎn)大于實(shí)體類** 第一個(gè):需要一個(gè)配置文件來配置service和dao* 配置的內(nèi)容:唯一標(biāo)識(shí)=全限定類名(key=value)* 第二個(gè):通過讀取配置文件中配置內(nèi)容,反射創(chuàng)建對(duì)象** 配置文件可以是 xml 也可以是 properties** @author zuiren* @create 2019/8/22* @since 1.0.0*/ public class BeanFactory {/*** 定義一個(gè) Properties 對(duì)象*/private static Properties props;/*** 使用靜態(tài)代碼塊為 Properties 對(duì)象賦值*/static {try {//實(shí)例化對(duì)象props=new Properties();//獲取 properties 文件的流對(duì)象InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(in);}catch (Exception e){throw new ExceptionInInitializerError("初始化 properties 失敗");}}/*** 根據(jù) Bean 的名稱獲取 bean 對(duì)象* @param beanName bean 名稱* @return*/public static Object getBean(String beanName){Object bean=null;try {String beanPath=props.getProperty(beanName);//每次都會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對(duì)象bean=Class.forName(beanPath).newInstance();}catch (Exception e){e.printStackTrace();}return bean;} }Ⅲ創(chuàng)建配置文件
accountService=service.impl.AccountServiceImpl accountDao=dao.impl.AccountDaoImplⅣ修改 AccountServiceImpl
public class AccountServiceImpl implements IAccountService {// private IAccountDao accountDao=new AccountDaoImpl(); private IAccountDao accountDao= (IAccountDao) BeanFactory.getBean("accountDao");public void saveAccount() {accountDao.saveAccount();} }Ⅴ主函數(shù)
public class Client {public static void main(String[] args) { // IAccountService as=new AccountServiceImpl();IAccountService as= (IAccountService) BeanFactory.getBean("accountService");as.saveAccount();} }Ⅵ總結(jié)
此刻我們可以正常運(yùn)行,而且沒有錯(cuò)誤
當(dāng)我們將 AccountServiceImpl 刪除時(shí),編譯環(huán)境沒有錯(cuò)誤顯示,而運(yùn)行時(shí)顯示錯(cuò)誤,這就是工廠模式解耦
7.分析工廠模式中的問題并改造
Ⅰ 修改下主函數(shù)
public class Client {public static void main(String[] args) { // IAccountService as=new AccountServiceImpl();for (int i=0;i<5;i++){IAccountService as= (IAccountService) BeanFactory.getBean("accountService");System.out.println(as);as.saveAccount();}} }運(yùn)行結(jié)果
service.impl.AccountServiceImpl@1540e19d 保存了 service.impl.AccountServiceImpl@677327b6 保存了 service.impl.AccountServiceImpl@14ae5a5 保存了 service.impl.AccountServiceImpl@7f31245a 保存了 service.impl.AccountServiceImpl@6d6f6e28 保存了可以看出現(xiàn)在是多例模式,每次運(yùn)行對(duì)象都會(huì)創(chuàng)建一次
Ⅱ、修改為單例模式
public class BeanFactory {/*** 定義一個(gè) Properties 對(duì)象*/private static Properties props;//定義一個(gè)Map,用于存放我們要?jiǎng)?chuàng)建的對(duì)象。我們稱之為容器private static Map<String,Object> beans;/*** 使用靜態(tài)代碼塊為 Properties 對(duì)象賦值*/static {try {//實(shí)例化對(duì)象props=new Properties();//獲取 properties 文件的流對(duì)象InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(in);//實(shí)例化容器beans=new HashMap<String, Object>();//去除配置文件中所有的 keyEnumeration keys=props.keys();//遍歷枚舉while (keys.hasMoreElements()){//取出每個(gè) keyString key=keys.nextElement().toString();//根據(jù) key 獲取 valueString beanPath=props.getProperty(key);//反射創(chuàng)建對(duì)象Object value=Class.forName(beanPath).newInstance();//吧key 和 value 存入容器中beans.put(key,value);}}catch (Exception e){throw new ExceptionInInitializerError("初始化 properties 失敗");}}/*** 根據(jù) Bean 的名稱獲取 bean 對(duì)象* @param beanName bean 名稱* @return*/public static Object getBean(String beanName){return beans.get(beanName);} }運(yùn)行主函數(shù)
service.impl.AccountServiceImpl@1540e19d 保存了 service.impl.AccountServiceImpl@1540e19d 保存了 service.impl.AccountServiceImpl@1540e19d 保存了 service.impl.AccountServiceImpl@1540e19d 保存了 service.impl.AccountServiceImpl@1540e19d 保存了轉(zhuǎn)載于:https://www.cnblogs.com/zuiren/p/11415411.html
總結(jié)
- 上一篇: 01-课程安排
- 下一篇: 04-spring的依赖注入