<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          IOC控制反轉(zhuǎn)理解

          共 6167字,需瀏覽 13分鐘

           ·

          2021-05-14 12:28

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          1. IOC基礎(chǔ)

          IOC:全稱Inversion Of Control,中文翻譯是控制反轉(zhuǎn)的意思。初學(xué)Spring繞不過去的一個(gè)彎,需要好好理解IOC的思想。網(wǎng)上看了很多博客,也看了很多網(wǎng)課,但是還是云里云霧。終于看到一個(gè)容易理解的例子,寫下自己對(duì)IOC的理解。

          2. IOC推導(dǎo)與理解

          首先編寫一個(gè)基本的項(xiàng)目,結(jié)構(gòu)如下:

          1. 有一個(gè)Meizi(妹子)接口,里面有一個(gè)方法describe。

          2. 編寫四個(gè)類(四種類型的妹子):Yujie(御姐)、Luoli(蘿莉)、Xuemei(學(xué)妹)、NvWang(女王)類實(shí)現(xiàn)Meizi接口,重寫describe方法。

          3. 一個(gè)Nan(男生)接口,里面有一個(gè)方法getMeizi。

          4. 編寫兩個(gè)類:yihao(一號(hào)男生)、erhao(二號(hào)男生)實(shí)現(xiàn)Nan接口,重寫getMeizi方法。

          為了簡(jiǎn)單方便將所有的類實(shí)現(xiàn)都放在一個(gè)代碼塊中,這里利用男生找對(duì)象的方式進(jìn)行理解IOC的含義。

          2.1、最基本的實(shí)現(xiàn)方式
          interface Meizi {
              public void describe();
          }


          class Yujie implements Meizi{
              @Override
              public void describe() {
                  System.out.println("御姐~");
              }
          }


          //這里只列出一種女生類型的具體實(shí)現(xiàn),其他的類似


          interface Nan {
              public void getMeizi();
          }

          class yihao implements Nan{

              @Override
              public void getMeizi() {
                  Meizi meizi = new Yujie();
                  meizi.describe();
              }
          }

          class erhao implements Nan{

              @Override
              public void getMeizi() {
                  Meizi meizi = new Yujie();
                  meizi.describe();
              }
          }


          現(xiàn)在整個(gè)實(shí)現(xiàn)是上圖所示,getMeizi方法內(nèi)部依賴四種類型的妹子。

          1. 很容易看到這種設(shè)計(jì)方式違背了OOP的設(shè)計(jì)原則,至少違背了迪米特法則。我們不應(yīng)該將一個(gè)陌生類(接口)作為局部變量!

          2. 沒有改動(dòng)的余地,現(xiàn)在男生都想找一個(gè)御姐對(duì)象,如果需求變更男生想找一個(gè)女王呢?是不是需要更改所有男生的代碼?

          2.2、采用組合的方式實(shí)現(xiàn)

          假設(shè)男生最開始都有一個(gè)御姐類型的女朋友

          interface Meizi {
              public void describe();
          }


          class Yujie implements Meizi{
              @Override
              public void describe() {
                  System.out.println("御姐~");
              }
          }


          //這里只列出一種女生類型的具體實(shí)現(xiàn),其他的類似


          interface Nan {
              public void getMeizi();
          }


          class yihao implements Nan{
              private Meizi meizi = new Yujie();
              
              @Override
              public void getMeizi() {
                  meizi.describe();
              }
          }
          class erhao implements Nan{
              private Meizi meizi = new Yujie();
              
              @Override
              public void getMeizi() {
                  meizi.describe();
              }
          }
          public class Main {
              public static void main(String[] args) {
                  yihao man1 = new yihao();   
                  man1.getMeizi();

                  erhao man2 = new erhao();
                  man2.getMeizi();
              }
          }


          采用組合關(guān)系之后如上圖,現(xiàn)在真正的問題來(lái)了:

          1. 組合關(guān)系:什么是組合關(guān)系?誰(shuí)也離不開誰(shuí)、二者之間是一個(gè)整體;比如:腦袋和身體這種關(guān)系;叫組合關(guān)系。

          2. 男一號(hào)、男二號(hào)能保證自己以后一定會(huì)跟御姐妹子走到最后嗎?或者說二者之間一定不會(huì)分手嗎?組合關(guān)系限定死了男一號(hào)、男二號(hào)更換對(duì)象的權(quán)利,他們沒有權(quán)利在更換對(duì)象了!當(dāng)然御姐妹子也沒有權(quán)利更換男朋友了!

          3. 如果想跟換對(duì)象是需要重新去修改源代碼,重新new一個(gè)對(duì)象。

          4. 這個(gè)代碼設(shè)計(jì)也不好,男生、女生都喪失了更換對(duì)象的權(quán)利。耦合度太高了,硬生生的將兩個(gè)人綁在了一起。

          2.3、采用聚合方式(松耦合)

          組合方式限定死了男生的對(duì)象、沒有辦法更換。現(xiàn)在將組合方式改為聚合,不在內(nèi)部直接new一個(gè)確定的對(duì)象(主動(dòng)創(chuàng)建)。而是通過set方法給男生一個(gè)女朋友(被動(dòng)接受)。

          interface Meizi {
              public void describe();
          }


          class Yujie implements Meizi{
              @Override
              public void describe() {
                  System.out.println("御姐~");
              }
          }


          //這里只列出一種女生類型的具體實(shí)現(xiàn),其他的類似


          interface Nan {
              public void getMeizi();
          }


          class yihao implements Nan{
              private Meizi meizi;

              public void setMeizi(Meizi meizi) {
                  this.meizi = meizi;
              }

              @Override
              public void getMeizi() {
                  meizi.describe();
              }
          }
          class erhao implements Nan{
              private Meizi meizi;

              public void setMeizi(Meizi meizi) {
                  this.meizi = meizi;
              }

              @Override
              public void getMeizi() {
                  meizi.describe();
              }
          }

          public class Main {
              public static void main(String[] args) {
                  yihao man1 = new yihao();
                  man1.setMeizi(new Yujie());
                  man1.getMeizi();

                  erhao man2 = new erhao();
                  man2.setMeizi(new Luoli());
                  man2.getMeizi();
              }
          }


          通過set注入方式就可以實(shí)現(xiàn)解耦。

          1. 假定IOC是一個(gè)婚介所,現(xiàn)在男女生都婚介所登記資料,男生告訴IOC需要什么樣的對(duì)象,IOC就給男生一個(gè)。

          2. 由男生主動(dòng)搭訕妹子尋找對(duì)象(new),演變成了被動(dòng)的由婚介所介紹對(duì)象(set注入)!

          3. 到此IOC就是大概一個(gè)這樣的概念:控制反轉(zhuǎn),反轉(zhuǎn)的是創(chuàng)建對(duì)象的方式,由主動(dòng)化為被動(dòng)的一個(gè)過程。

          3. IOC總結(jié)


          控制 : 誰(shuí)來(lái)控制對(duì)象的創(chuàng)建 , 傳統(tǒng)應(yīng)用程序的對(duì)象是由程序本身控制創(chuàng)建的 , 使用Spring后 , 對(duì)象是由Spring的IOC容器來(lái)創(chuàng)建的

          反轉(zhuǎn) : 程序本身不創(chuàng)建對(duì)象 , 而變成被動(dòng)的接收對(duì)象 .




          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/weixin_43808717/article/details/116425554






          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒





          感謝點(diǎn)贊支持下哈 

          瀏覽 70
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色无码一区二区 | 国产精品内射婷婷一级二 | 97超碰资源总站 | 99精品少妇 | 国产国产国产在线无码视频 |