定義一個建立對象的類,由這個類來封裝實例化對象的行爲java
優勢程序員
缺點面試
小鳥:「牛哥,好奇怪啊,我那天面試時,面試官只讓我寫了一個九九乘法表,我感受本身寫的ok啊!怎麼還沒通知我去上班捏?」算法
大牛:「是嗎?你怎麼寫的啊?」ide
小鳥:「你看,這是個人代碼,難道還有更簡單的實現方式嗎?」測試
public class Test { public static void main(String[] arrays) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d*%d=%d\t", j, i, i * j)); } System.out.println(""); } } }
大牛:「你的代碼確實挺簡潔的,算法也用的不錯,可是你有沒有想過,爲何只讓你寫這樣一個效果呢?有點程序基礎的,都知道這麼寫,很明顯,這樣的話,不能區分大家的水平,既然如此,那他爲啥還要這樣出呢?是無聊,是想報復公司,隨便找些人去應付boss,這裏的回答是否認的,那麼,你再想一想java是一種什麼樣的語言,它有什麼樣的特性?」ui
小鳥:「java是一種面向對象的語言,它的特性,地球人都知道:繼承、封裝、多態啊!」3d
大牛:「對啊!java是一種面向對象的語言,你這裏體現面向對象的思想了沒?繼承、封裝、多態這些特性用到了多少?」code
小鳥:「嗯~,貌似只是實現了簡單的算法,這些特性確實都沒用着耶!可是這裏也不必用這些啊?」orm
大牛:「我以爲顯示在電腦上面攜帶不方便,我想換到手機屏幕上去顯示,這樣攜帶方便,還能利用零散的時間隨時去記憶,多好!」
小鳥:「這還不簡單,直接將這個算法複製
過去就好了,每個優秀的程序員,必先是一個偉大的CV戰士,拒絕重複製造輪子,能複製則複製。」
大牛:「小鳥,你這話算是說對了一半。」
小鳥:「哦!是嗎?那應該是?」
大牛:「複用
,每個優秀的程序員,必先是一個偉大的CV戰士,拒絕重複製造輪子,能複用則複用。小鳥,你再想一想,當你在作一個大型的項目時,裏面有好多相同的功能,只是,展現出來的效果有點不一樣,這時你會想,這項目也太容易了,我寫好一個,改一下ui,而後就將它複製到其它地方就好了,複製,複製,複製到這,複製到那,都誰複製,太容易了,你很是興奮的,通宵達旦的就將全部功能開發完畢,而後準備上線,這時測試美美髮現了一個小bug。」
小鳥:「我會崩潰的,好不容易弄完,唉~,要改這麼多地方,累死寶寶了。」
大牛:「是呢!想一想就夠讓人抓狂的。小鳥,你再仔細想一想java的特性,以及我剛纔跟你說的複用。」
小鳥:「哦!我明白了,我們就以我此次面試爲例,我再給寫一個,你幫我看看。」
public class Multiplication { public static void mutiplicationTable() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d*%d=%d\t", j, i, i * j)); } System.out.println(""); } } }
小鳥:「牛哥,我這裏將九九乘法表進行了封裝,就跟你以前說的,我要在哪顯示,我只須要引用它就行,至於顯示在哪,不用管,這樣的話,也就達到了一個複用的效果,不會再出現複製致使的災難了。」
大牛:「悟性不錯,這樣確實作到了界面邏輯與業務邏輯的分離
。」
小鳥:「牛哥,java他有三大特性,可是我只用到了一種,封裝,你開始有跟我說過,這是[kao]3大特性,可是其它兩種,我確實想不到,它怎麼體現。」
大牛:「能思[kao],不錯!那好,再啓發你一下,你想一想,我這裏雖然只是乘法表,可是若是我想作加法表、除法表,減法表呢?」
小鳥:「這還不容易,我加一個參數,用來表示是加法、減法、仍是除法,而後在改一下for循環裏面的輸出,添加switch case就o了。」
大牛:「小鳥,你這思惟可就是計算機的思惟了,你再想一想,要是如今只要求你添加加法表,後來,要要求你添加減法表,你手一抖,不當心將之前的加法也改爲了減法,想一想最後的結果,越加越小,會不會嚇死寶寶呢?再想一想繼承,多態。 」
小鳥:「牛哥,這是我寫的代碼,這裏將繼承和多態都用上了,可是,我怎麼知道用戶何時要乘法表,何時要加法表呢?」 抽象產品角色:LowTable
public abstract class LowTable { public abstract void low(); }
具體產品角色1:Multiplication
乘法
public class Multiplication extends LowTable{ @Override public void low() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d*%d=%d\t", j, i, i * j)); } System.out.println(""); } } }
具體產品角色2:Addition
加法
public class Addition extends LowTable { @Override public void low() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(String.format("%d+%2d=%3d", j, i, i+j)); } System.out.println(""); } } }
大牛:「不錯,不錯,真不錯,那就再教你一招,簡單工廠模式
,在此基礎上,加一個工廠類,用來實例化對象,已解決你不知道用哪一個對象的疑惑。」 工廠類角色:LowTableFactory
public class LowTableFactory { public static LowTable createLowTable(String tableName) { switch (tableName) { case "*": return new Multiplication(); case "+": return new Addition(); } return new Multiplication(); } }
大牛:「看到了吧,只要輸入對應的運算符,就能找到對應的法則表對象,經過多態,調用父類的方法,便可獲得咱們的法則表」
客戶端使用
public static void main(String[] arrays) { LowTable lowTable = LowTableFactory.createLowTable("+"); lowTable.low(); }
小鳥:「這麼說,我就明白了,我那天面試時,寫的乘法表,確實是計算機的思惟,原來一個小小的乘法表,中間還有這麼大的學問,也能夠寫得這麼精彩,謝謝你,牛哥!」