簡述面向對象的六大原則

單一職責原則

一個類中應該是一組相關性很高的函數、數據的封裝;

開閉原則

  • 定義:對於擴展是開放的,對於修改是封閉的;
  • 理解:意思就是可以任意的往外邊擴展,但是不能對寫好的修改,怎麼達到這個要求呢?寫接口。執行的方法寫成接口,這樣如果我們要擴展不同的實現,那就可以擴展新的實現了原來接口的類,然後丟進去就可以啦;
  • 實例:

    //執行體
    class A {
        // H:相當於任務的執行者
        private void doA( H h){
            h.doMyTask();//此處調用接口的方法,達到 閉 的效果,只管我要幹啥,具體怎麼幹可以不管
        }
    }
    ---------------------------
    // 接口
    interface H{
        void doMyTask();
    }
    ---------------------------
    //任務執行者實現體
    class B implements H{
        void doMyTask(){
            sys.out("幹B的活");
        }
    }
    
    class C implements H{
         void doMyTask(){
             sys.out("幹C的活");
         }
    }
    
    //操作者
    class K {
        A a =new A();
        a.doA(new B);
        a.doA(new C);
        a.doA(new H(){
            doMyTask(){
                 sys.out("幹隨時擴展自定義的活");
            }
        });
    
    }
    

    +實例分析:
    由上述我們可以分析得出,如果我是老K,我現在要讓A幹一件活,現在我知道要他幹什麼活,可以寫死在A的doA()方法裏邊,但是如果有一天這個活有了不同的要求,那麼我同樣還是找A來幹活,但是幹什麼活,通過接口的不同實現來定義;

里氏替換原則 LSP

  • 定義:所有應用其基類的地方,必須都能透明的使用其子類的對象;
  • 核心原理:抽象、繼承、多態
  • 理解:當我要一個人幹一種活的時候,發現有一類人都要幹這種活,比如吃飯。那麼,我就可以把這一類人抽象出來,同樣幹“吃飯”這種活,不過很明顯,每個人都會有每個人的吃放。所以吃飯這個活也是抽象的,繼承的實現體具體去幹自己的活。當然,加入我是食堂的,我喊一聲可以吃放了。然後不同的人(實現體)就跑進食堂,紛紛吃自己的飯啦!
  • 實例:

    //食堂
    class ShiTang{
    void ganHuo(Person p){
    p.chiFan();
    }
    }
    //抽象
    abstarct class Person{
    public abstarct foid chiFan();
    public void shuiJiao(){
    //do ….
    }
    }
    //小明
    class xiaoMing extends Person{
    public void chiFan(){
    sys.out(“小明吃飯”);
    }
    }
    //小兵
    class xiaoBing extends Person{
    public void chiFan(){
    sys.out(“小兵吃飯”);
    }
    }

  • 分析:由Person類可以知道,我們把一類人抽象到父類,若果某一件活,不同子類有不同的幹法,就發方法抽象出來,子類繼承再具體實現它。真正要這一類人幹活的時候,直接調父類。這樣,如果傳入的是子類,也同樣適用,並且還能實現各幹各的活;

依賴倒置原則 DIP

  • 定義:模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過接口或者抽象類產生的;
  • 理解:假如我現在需要租個房子,然後我把身邊的朋友叫過來,說給我幫忙找個房子。然後朋友們就去找了。還有一種方案,我可以打個電話給中介,讓中介給我找。這樣的優勢就是,我和真正去找房子的人沒有直接的聯繫。如果朋友臨時有事,可能就不能幫忙給我找了。但是,中介就不會發生這種情況;所以,當我們要做一件事的時候,並不需要把做事的人拉進來,而只需要下訂單,把事情外包給專門做這種事情的人去做,具體是誰就不要管那麼多;這樣,可以隨時更換外包公司,而不影響自身業務;
  • 實例:

    //我
    class Me{
       Zu zu ;
        // 我找個中介
        void setZu(Zu zu){
            this.zu=zu;
        }
        void zuFangZi(){
            zu.zuFang();//我找中介給我租房子
        }
    }
    //租房這件事
    interface Zu{
        void zuFang();
    }
    //中介 專幹租房的事
    class ZhongJie implements Zu{
        void zuFang(){
          sys.out("中介租房");
        }
    }
    
  • 分析:有上述示例可以發現,我 和 中介 沒有了直接的關聯,但是照樣把事情幹了。如果這個中介倒閉了,我只要去換一家同樣嫩幫我租房子的中介set進來就可以啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章