| 文檔版本 | 開發(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í)例。
- 每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接??梢酝ㄟ^
- 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;
* }
* }
*/