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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02-耦合和解耦

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02-耦合和解耦 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、程序的耦合
    • 1.耦合:
    • 2.解耦:
    • 3.實際開發中:
    • 4.解耦思路:
    • 5.例子:耦合性很強
      • Ⅰdao
      • Ⅱ service
      • Ⅲ主函數
    • 6.解耦
      • Ⅰ思路
      • Ⅱ 創建工廠類
      • Ⅲ創建配置文件
      • Ⅳ修改 AccountServiceImpl
      • Ⅴ主函數
      • Ⅵ總結
    • 7.分析工廠模式中的問題并改造
      • Ⅰ 修改下主函數
      • Ⅱ、修改為單例模式

一、程序的耦合

1.耦合:

程序間的依賴關系

包括:

  • 類之間的依賴。

  • 方法間的依賴。

  • 2.解耦:

    降低程序間的依賴關系。

    3.實際開發中:

    應該做到編譯期不依賴,運行時才依賴。

    4.解耦思路:

  • 使用反射來創建對象,而避免使用new關鍵字。
  • 通過讀取配置文件來獲取要創建的對象全限定類名。
  • 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

    總結

    以上是生活随笔為你收集整理的02-耦合和解耦的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。