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