Java基礎(chǔ)學(xué)習(xí)第二十五天——設(shè)計(jì)模式

文檔版本 開發(fā)工具 測試平臺 工程名字 日期 作者 備注
V1.0 2016.04.02 lutianfei none

[TOC]


面向?qū)ο笏枷朐O(shè)計(jì)原則

  • 單一職責(zé)原則
  • 開閉原則
  • 里氏替換原則
  • 依賴注入原則
  • 接口分離原則
  • 迪米特原則

單一職責(zé)原則

  • 其實(shí)就是開發(fā)人員經(jīng)常說的“高內(nèi)聚,低耦合
  • 也就是說,每個(gè)類應(yīng)該只有一個(gè)職責(zé),對外只能提供一種功能,而引起類變化的原因應(yīng)該只有一個(gè)。在設(shè)計(jì)模式中,所有的設(shè)計(jì)模式都遵循這一原則。

開閉原則

  • 核心思想是:一個(gè)對象對擴(kuò)展開放,對修改關(guān)閉。
  • 其實(shí)開閉原則的意思就是:對類的改動是通過增加代碼進(jìn)行的,而不是修改現(xiàn)有代碼。
  • 也就是說軟件開發(fā)人員一旦寫出了可以運(yùn)行的代碼,就不應(yīng)該去改動它,而是要保證它能一直運(yùn)行下去,如何能夠做到這一點(diǎn)呢?這就需要借助于抽象和多態(tài),即把可能變化的內(nèi)容抽象出來,從而使抽象的部分是相對穩(wěn)定的,而具體的實(shí)現(xiàn)則是可以改變和擴(kuò)展的。

里氏替換原則

  • 核心思想:在任何父類出現(xiàn)的地方都可以用它的子類來替代
  • 其實(shí)就是說:同一個(gè)繼承體系中的對象應(yīng)該有共同的行為特征。

依賴注入原則

  • 核心思想:要依賴于抽象,不要依賴于具體實(shí)現(xiàn)。
  • 其實(shí)就是說:在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。為了實(shí)現(xiàn)這一原則,就要求我們在編程的時(shí)候針對抽象類或者接口編程,而不是針對具體實(shí)現(xiàn)編程。

接口分離原則

  • 核心思想不應(yīng)該強(qiáng)迫程序依賴它們不需要使用的方法。
  • 其實(shí)就是說:一個(gè)接口不需要提供太多的行為,一個(gè)接口應(yīng)該只提供一種對外的功能,不應(yīng)該把所有的操作都封裝到一個(gè)接口中。

迪米特原則

  • 核心思想一個(gè)對象應(yīng)當(dāng)對其他對象盡可能少的了解
  • 其實(shí)就是說:降低各個(gè)對象之間的耦合,提高系統(tǒng)的可維護(hù)性。在模塊之間應(yīng)該只通過接口編程,而不理會模塊的內(nèi)部工作原理,它可以使各個(gè)模塊耦合度降到最低,促進(jìn)軟件的復(fù)用


設(shè)計(jì)模式

設(shè)計(jì)模式概述

  • 設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
  • 設(shè)計(jì)模式不是一種方法和技術(shù),而是一種思想
  • 設(shè)計(jì)模式和具體的語言無關(guān),學(xué)習(xí)設(shè)計(jì)模式就是要建立面向?qū)ο蟮乃枷?,盡可能的面向接口編程,低耦合,高內(nèi)聚,使設(shè)計(jì)的程序可復(fù)用
  • 學(xué)習(xí)設(shè)計(jì)模式能夠促進(jìn)對面向?qū)ο笏枷氲睦斫?,反之亦然。它們相輔相成

設(shè)計(jì)模式的幾個(gè)要素

  • 名字 必須有一個(gè)簡單,有意義的名字
  • 問題 描述在何時(shí)使用模式
  • 解決方案 描述設(shè)計(jì)的組成部分以及如何解決問題
  • 效果 描述模式的效果以及優(yōu)缺點(diǎn)

設(shè)計(jì)模式的分類

  • 創(chuàng)建型模式:對象的創(chuàng)建(6)
    • 簡單工廠模式工廠方法模式,抽象工廠模式,建造者模式,原型模式單例模式。
  • 結(jié)構(gòu)型模式:對象的組成(結(jié)構(gòu))(7)
    • 外觀模式、適配器模式代理模式、裝飾模式、橋接模式組合模式、享元模式
  • 行為型模式:對象的行為(10)
    • 模版方法模式、觀察者模式、狀態(tài)模式、職責(zé)鏈模式、命令模式、訪問者模式、策略模式、備忘錄模式、迭代器模式、解釋器模式。


簡單工廠模式

簡單工廠模式概述
  • 又叫靜態(tài)工廠方法模式,它定義一個(gè)具體的工廠類負(fù)責(zé)創(chuàng)建一些類的實(shí)例
  • 優(yōu)點(diǎn)
    • 客戶端不需要在負(fù)責(zé)對象的創(chuàng)建,從而明確了各個(gè)類的職責(zé)
  • 缺點(diǎn)
    • 這個(gè)靜態(tài)工廠類負(fù)責(zé)所有對象的創(chuàng)建,如果有新的對象增加,或者某些對象的創(chuàng)建方式不同,就需要不斷的修改工廠類,不利于后期的維護(hù)
public class AnimalDemo {
    public static void main(String[] args) {
        // 具體類調(diào)用
        Dog d = new Dog();
        d.eat();
        Cat c = new Cat();
        c.eat();
        System.out.println("------------");

        // 工廠有了后,通過工廠給造
        // Dog dd = AnimalFactory.createDog();
        // Cat cc = AnimalFactory.createCat();
        // dd.eat();
        // cc.eat();
        // System.out.println("------------");

        // 工廠改進(jìn)后
        Animal a = AnimalFactory.createAnimal("dog");
        a.eat();
        a = AnimalFactory.createAnimal("cat");
        a.eat();

        // NullPointerException
        a = AnimalFactory.createAnimal("pig");
        if (a != null) {
            a.eat();
        } else {
            System.out.println("對不起,暫時(shí)不提供這種動物");
        }
    }
}




public abstract class Animal {
    public abstract void eat();
}


public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("貓吃魚");
    }

}


public class Dog extends Animal {

    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

}


public class AnimalFactory {

    private AnimalFactory() {
    }

    // public static Dog createDog() {
    // return new Dog();
    // }
    //
    // public static Cat createCat() {
    // return new Cat();
    // }

    public static Animal createAnimal(String type) {
        if ("dog".equals(type)) {
            return new Dog();
        } else if ("cat".equals(type)) {
            return new Cat();
        } else {
            return null;
        }
    }
}


工廠方法模式

工廠方法模式概述
  • 工廠方法模式中·抽象工廠類·負(fù)責(zé)定義創(chuàng)建對象接口,具體對象的創(chuàng)建工作由繼承抽象工廠的具體類實(shí)現(xiàn)。

  • 優(yōu)點(diǎn)

    • 客戶端不需要在負(fù)責(zé)對象的創(chuàng)建,從而明確了各個(gè)類的職責(zé),如果有新的對象增加,只需要增加一個(gè)具體的類具體的工廠類即可,不影響已有的代碼,后期維護(hù)容易,增強(qiáng)了系統(tǒng)的擴(kuò)展性
  • 缺點(diǎn)

    • 需要額外的編寫代碼,增加了工作量
public class AnimalDemo {
    public static void main(String[] args) {
        // 需求:我要買只狗
        Factory f = new DogFactory();
        Animal a = f.createAnimal();
        a.eat();
        System.out.println("-------");
        
        //需求:我要買只貓
        f = new CatFactory();
        a = f.createAnimal();
        a.eat();
    }
}


public abstract class Animal {
    public abstract void eat();
}


public interface Factory {
    public abstract Animal createAnimal();
}


public class Dog extends Animal {

    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

}


public class DogFactory implements Factory {

    @Override
    public Animal createAnimal() {
        return new Dog();
    }

}


public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("貓吃魚");
    }

}


public class CatFactory implements Factory {

    @Override
    public Animal createAnimal() {
        return new Cat();
    }

}


單例設(shè)計(jì)模式

單例設(shè)計(jì)模式概述
  • 單例模式就是要確保類在內(nèi)存中只有一個(gè)對象,該實(shí)例必須自動創(chuàng)建,并且對外提供。

  • 優(yōu)點(diǎn)

    • 在系統(tǒng)內(nèi)存中只存在一個(gè)對象,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
  • 缺點(diǎn)

    • 沒有抽象層,因此擴(kuò)展很難。
    • 職責(zé)過重,在一定程序上違背了單一職責(zé)
  • 如何保證類在內(nèi)存中只有一個(gè)對象呢?

    • A:把構(gòu)造方法私有
    • B:在成員位置自己創(chuàng)建一個(gè)對象
    • C:通過一個(gè)公共的方法提供訪問
單例設(shè)計(jì)模式分類
  • 餓漢式(開發(fā)使用)
    • 類一加載就創(chuàng)建對象
public class StudentDemo {
    public static void main(String[] args) {
        // Student s1 = new Student();
        // Student s2 = new Student();
        // System.out.println(s1 == s2); // false

        // 通過單例如何得到對象呢?

        // Student.s = null;

        Student s1 = Student.getStudent();
        Student s2 = Student.getStudent();
        System.out.println(s1 == s2);

        System.out.println(s1); // null,cn.itcast_03.Student@175078b
        System.out.println(s2);// null,cn.itcast_03.Student@175078b
    }
}



public class Student {
    // 構(gòu)造私有,不讓外界構(gòu)造對象。
    private Student() {
    }

    // 自己造一個(gè)
    // 靜態(tài)方法只能訪問靜態(tài)成員變量,加靜態(tài)
    // 為了不讓外界直接訪問修改這個(gè)值,加private
    private static Student s = new Student();

    // 提供公共的訪問方式
    // 為了保證外界能夠直接使用該方法,加靜態(tài)
    public static Student getStudent() {
        return s;
    }
}


  • 懶漢式(面試常問): 用的時(shí)候,才去創(chuàng)建對象
    • 線程安全問題
    • 懶加載思想(延遲加載)
public class TeacherDemo {
    public static void main(String[] args) {
        Teacher t1 = Teacher.getTeacher();
        Teacher t2 = Teacher.getTeacher();
        System.out.println(t1 == t2);
        System.out.println(t1); // cn.itcast_03.Teacher@175078b
        System.out.println(t2);// cn.itcast_03.Teacher@175078b
    }
}


public class Teacher {
    private Teacher() {
    }

    private static Teacher t = null;

    public synchronized static Teacher getTeacher() {
        // t1,t2,t3
        if (t == null) {
            //t1,t2,t3
            t = new Teacher();
        }
        return t;
    }
}


Runtime類的概述和使用

  • Runtime類概述
    • 每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接??梢酝ㄟ^ getRuntime 方法獲取當(dāng)前運(yùn)行時(shí)。
    • 應(yīng)用程序不能創(chuàng)建自己的 Runtime 類實(shí)例。
  • Runtime類使用
    • public Process exec(String command)
/*
 * Runtime:每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。
 * exec(String command)
 */
public class RuntimeDemo {
    public static void main(String[] args) throws IOException {
        Runtime r = Runtime.getRuntime();
//        r.exec("winmine");
        // r.exec("notepad");
        // r.exec("calc");
//        r.exec("shutdown -s -t 10000");
        r.exec("shutdown -a");
    }
}

/*
 * class Runtime {
 *         private Runtime() {}
 *         private static Runtime currentRuntime = new Runtime();
 *         public static Runtime getRuntime() {
 *           return currentRuntime;
 *       }
 * }
 */


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容