1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        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ì)跟御姐妹子走到最后嗎?或者說(shuō)二者之間一定不會(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)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            午夜精品久久久久久久 | 黄色一级A片老女人 | 激情婷婷 | 女虐男喝尿直播调教 | 国产无码黄色片 | 极品超粉嫩尤物69xx | 国产午夜伦理片 | 娇妻被引诱与老外多p | 同性恋男男在线看污片 | 黄动漫视频在线观看 |