我对设计模式不屑一顾
生活随笔
收集整理的這篇文章主要介紹了
我对设计模式不屑一顾
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2011年在金蝶,部門組織了一個(gè)培訓(xùn),由一個(gè)資深的老前輩(紀(jì)大松)講了一次23種設(shè)計(jì)模式,當(dāng)時(shí)懵懵懂懂,對(duì)設(shè)計(jì)模式不屑一顧。如今時(shí)隔6年,忙里偷閑,我又將23種設(shè)計(jì)模式看了一遍,依然不屑一顧。6年前不屑一顧,其實(shí)是似懂非懂,如今不屑一顧,就真的是不屑一顧了。
說不屑一顧,并不是說設(shè)計(jì)模式?jīng)]有屌用,反而,我對(duì)總結(jié)出這套理論的大牛們心存感激亦存尊重。我想表達(dá)的是,“設(shè)計(jì)”,“模式”這兩個(gè)詞看起來似乎很高大上,好像自己沾點(diǎn)邊那就跟架構(gòu)師乃至技術(shù)總監(jiān)相隔不遠(yuǎn)了,但卻并不如大家想象的那樣遙遠(yuǎn)和高深。
我面過一些人,也被很多人面過,在面試java時(shí)設(shè)計(jì)模式是很常見的話題,很遺憾的是,幾乎所有人討論的都是設(shè)計(jì)模式本身,諸如:你用過哪些設(shè)計(jì)模式啊?原理什么樣的?畫個(gè)類圖看看?使用場(chǎng)景有哪些?門面模式和代理模式有什么區(qū)別等等。我曾經(jīng)遇見過一位同事,可以說是個(gè)技術(shù)面很廣的人,你隨便說個(gè)技術(shù)名詞能跟你講一大堆,23種設(shè)計(jì)模式你隨便挑一個(gè),他都能準(zhǔn)確的幫你把概念,類圖,優(yōu)缺點(diǎn),適用于哪些場(chǎng)景“背”出來。但是看過他的代碼后,我很悲哀。
在我認(rèn)為,真正懂得設(shè)計(jì)模式的人,是不需要去記那些繁瑣的名詞以及概念的,因?yàn)椤霸O(shè)計(jì)模式”對(duì)他們來說是“不屑”的(除非他刻意去記)。因?yàn)?#xff1a;
1.設(shè)計(jì)模式只是一些優(yōu)秀經(jīng)驗(yàn)的積累,
舉個(gè)栗子:老板說要模擬一個(gè)小孩哭的場(chǎng)景,這小孩一哭就哇哇哇。
報(bào)告老板,寫完了。
public class Baby {
public void cry() {
System.out.println("wa wa wa!");
}
}
老板又說了,家里有條狗,小孩一哭,狗也跟著叫。
好吧,改一改,先加條狗:
public class Dog {
public void bark() {
System.out.println("汪汪汪!");
}
}
然后,小孩一哭,狗就跟著叫
public class Baby {
private Dog dog;
public void cry() {
System.out.println("哇哇哇!");
if (dog != null) dog.bark();
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
老板又說了,主人還養(yǎng)了貓,貓也跟著叫
好,再改
public class Cat {
public void bark() {
System.out.println("喵喵喵!");
}
}
public class Baby {
private Dog dog;
private Cat cat;
public void cry() {
System.out.println("哇哇哇!");
if (dog != null) dog.bark();
if (cat != null) cat.bark();
}
// getter and setter
}
老板又說了,還有雞,雞還不少,好多只。
如果你還認(rèn)為要這樣繼續(xù)加下去我覺得你是一個(gè)不合格的程序猿,我相信大部分人肯定會(huì)尋思怎么改了,怎么更容易讓老板的需求變得容易實(shí)現(xiàn):
先抽象一個(gè)動(dòng)物,dog和cat直接實(shí)現(xiàn)它
public interface Animal {
void bark();
}
public class Cat implements Animal {
public void bark() {
System.out.println("喵喵喵!");
}
}
public class Dog implements Animal {
public void bark() {
System.out.println("汪汪汪!");
}
}
然后改Baby
public class Baby {
private List<Animal> animals = new ArrayList<Animal>();
public void cry() {
System.out.println("哇哇哇!");
for (Animal animal : animals) {
animal.bark();
}
}
public void addAnimal(Animal animal) {
animals.add(animal);
}
// getter and setter
}
現(xiàn)在好了,老板,你家愛有多少動(dòng)物就有多少吧。
我相信任何一個(gè)不懂設(shè)計(jì)模式的程序猿,稍微有些工作經(jīng)驗(yàn),只要有心優(yōu)化這段代碼,不想再被老板無休止得加動(dòng)物而煩惱,這段代碼寫出來并不難,而這就是23種設(shè)計(jì)模式中的監(jiān)聽者模式。即使你連設(shè)計(jì)模式是什么也不知道,只要有心寫上若干年,某天突然來看,你會(huì)發(fā)現(xiàn),幾乎所有的設(shè)計(jì)模式你都用過。
2.設(shè)計(jì)模式更多的只是一種思想,而不在于代碼
再舉個(gè)例子,還是小孩哭,小孩一哭媽媽就喂奶。某某對(duì)于設(shè)計(jì)模式非常“精通”,于是這樣寫:
public interface IMother {
void nurse();
}
public class Mother implements IMother {
public void nurse() {
System.out.println("乖寶寶別哭!");
}
}
public class Baby {
private List<Mother> mothers = new ArrayList<Mother>();
public void cry() {
System.out.println("哇哇哇!");
for (Mother mother : mothers) {
mother.nurse();
}
}
public void addMother(Mother mother) {
mothers.add(mother);
}
// getter and setter
}
不好意思,老板,作為一個(gè)老司機(jī),你所有的需求變化都在我的預(yù)料之中,隨便你怎么變,我都能滿足你,因?yàn)槲矣昧嗽O(shè)計(jì)模式中的監(jiān)聽者模式!!
老板:你他媽腦袋有包,小孩能有幾個(gè)媽???
spring mvc的controller,service類并沒有要求寫成單例模式,也沒有寫工廠,但是實(shí)際上這些類spring都是生成的單例,而且所有實(shí)例統(tǒng)一管控。這不正是單例模式和工廠模式的思想么?當(dāng)你真正明白這些思想時(shí),并不會(huì)拘泥于這些模式。
另外也說一點(diǎn),真正好的設(shè)計(jì),并不是基于你用了多少設(shè)計(jì)模式,而是基于你對(duì)當(dāng)前業(yè)務(wù)和業(yè)務(wù)擴(kuò)展性的理解,非要把一些不會(huì)擴(kuò)展的地方寫成松耦合,濫用設(shè)計(jì)模式,只會(huì)導(dǎo)致工作量增加和類泛濫!
所以,請(qǐng)所有的面試官們,如果你仍然為自己“懂”那么多設(shè)計(jì)模式而感覺高高在上,請(qǐng)停止你那些愚蠢的提問,因?yàn)楹芸赡芤粋€(gè)真正的程序猿就被你的無知給篩掉了。
設(shè)計(jì)模式體現(xiàn)在每一行追求完美的代碼中,而我們無須追尋!
謹(jǐn)以此文獻(xiàn)給那些總在力求讓自己的代碼更加優(yōu)美,更加易于業(yè)務(wù)擴(kuò)展的程序猿們。
說不屑一顧,并不是說設(shè)計(jì)模式?jīng)]有屌用,反而,我對(duì)總結(jié)出這套理論的大牛們心存感激亦存尊重。我想表達(dá)的是,“設(shè)計(jì)”,“模式”這兩個(gè)詞看起來似乎很高大上,好像自己沾點(diǎn)邊那就跟架構(gòu)師乃至技術(shù)總監(jiān)相隔不遠(yuǎn)了,但卻并不如大家想象的那樣遙遠(yuǎn)和高深。
我面過一些人,也被很多人面過,在面試java時(shí)設(shè)計(jì)模式是很常見的話題,很遺憾的是,幾乎所有人討論的都是設(shè)計(jì)模式本身,諸如:你用過哪些設(shè)計(jì)模式啊?原理什么樣的?畫個(gè)類圖看看?使用場(chǎng)景有哪些?門面模式和代理模式有什么區(qū)別等等。我曾經(jīng)遇見過一位同事,可以說是個(gè)技術(shù)面很廣的人,你隨便說個(gè)技術(shù)名詞能跟你講一大堆,23種設(shè)計(jì)模式你隨便挑一個(gè),他都能準(zhǔn)確的幫你把概念,類圖,優(yōu)缺點(diǎn),適用于哪些場(chǎng)景“背”出來。但是看過他的代碼后,我很悲哀。
在我認(rèn)為,真正懂得設(shè)計(jì)模式的人,是不需要去記那些繁瑣的名詞以及概念的,因?yàn)椤霸O(shè)計(jì)模式”對(duì)他們來說是“不屑”的(除非他刻意去記)。因?yàn)?#xff1a;
1.設(shè)計(jì)模式只是一些優(yōu)秀經(jīng)驗(yàn)的積累,
舉個(gè)栗子:老板說要模擬一個(gè)小孩哭的場(chǎng)景,這小孩一哭就哇哇哇。
報(bào)告老板,寫完了。
public class Baby {
public void cry() {
System.out.println("wa wa wa!");
}
}
老板又說了,家里有條狗,小孩一哭,狗也跟著叫。
好吧,改一改,先加條狗:
public class Dog {
public void bark() {
System.out.println("汪汪汪!");
}
}
然后,小孩一哭,狗就跟著叫
public class Baby {
private Dog dog;
public void cry() {
System.out.println("哇哇哇!");
if (dog != null) dog.bark();
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
老板又說了,主人還養(yǎng)了貓,貓也跟著叫
好,再改
public class Cat {
public void bark() {
System.out.println("喵喵喵!");
}
}
public class Baby {
private Dog dog;
private Cat cat;
public void cry() {
System.out.println("哇哇哇!");
if (dog != null) dog.bark();
if (cat != null) cat.bark();
}
// getter and setter
}
老板又說了,還有雞,雞還不少,好多只。
如果你還認(rèn)為要這樣繼續(xù)加下去我覺得你是一個(gè)不合格的程序猿,我相信大部分人肯定會(huì)尋思怎么改了,怎么更容易讓老板的需求變得容易實(shí)現(xiàn):
先抽象一個(gè)動(dòng)物,dog和cat直接實(shí)現(xiàn)它
public interface Animal {
void bark();
}
public class Cat implements Animal {
public void bark() {
System.out.println("喵喵喵!");
}
}
public class Dog implements Animal {
public void bark() {
System.out.println("汪汪汪!");
}
}
然后改Baby
public class Baby {
private List<Animal> animals = new ArrayList<Animal>();
public void cry() {
System.out.println("哇哇哇!");
for (Animal animal : animals) {
animal.bark();
}
}
public void addAnimal(Animal animal) {
animals.add(animal);
}
// getter and setter
}
現(xiàn)在好了,老板,你家愛有多少動(dòng)物就有多少吧。
我相信任何一個(gè)不懂設(shè)計(jì)模式的程序猿,稍微有些工作經(jīng)驗(yàn),只要有心優(yōu)化這段代碼,不想再被老板無休止得加動(dòng)物而煩惱,這段代碼寫出來并不難,而這就是23種設(shè)計(jì)模式中的監(jiān)聽者模式。即使你連設(shè)計(jì)模式是什么也不知道,只要有心寫上若干年,某天突然來看,你會(huì)發(fā)現(xiàn),幾乎所有的設(shè)計(jì)模式你都用過。
2.設(shè)計(jì)模式更多的只是一種思想,而不在于代碼
再舉個(gè)例子,還是小孩哭,小孩一哭媽媽就喂奶。某某對(duì)于設(shè)計(jì)模式非常“精通”,于是這樣寫:
public interface IMother {
void nurse();
}
public class Mother implements IMother {
public void nurse() {
System.out.println("乖寶寶別哭!");
}
}
public class Baby {
private List<Mother> mothers = new ArrayList<Mother>();
public void cry() {
System.out.println("哇哇哇!");
for (Mother mother : mothers) {
mother.nurse();
}
}
public void addMother(Mother mother) {
mothers.add(mother);
}
// getter and setter
}
不好意思,老板,作為一個(gè)老司機(jī),你所有的需求變化都在我的預(yù)料之中,隨便你怎么變,我都能滿足你,因?yàn)槲矣昧嗽O(shè)計(jì)模式中的監(jiān)聽者模式!!
老板:你他媽腦袋有包,小孩能有幾個(gè)媽???
spring mvc的controller,service類并沒有要求寫成單例模式,也沒有寫工廠,但是實(shí)際上這些類spring都是生成的單例,而且所有實(shí)例統(tǒng)一管控。這不正是單例模式和工廠模式的思想么?當(dāng)你真正明白這些思想時(shí),并不會(huì)拘泥于這些模式。
另外也說一點(diǎn),真正好的設(shè)計(jì),并不是基于你用了多少設(shè)計(jì)模式,而是基于你對(duì)當(dāng)前業(yè)務(wù)和業(yè)務(wù)擴(kuò)展性的理解,非要把一些不會(huì)擴(kuò)展的地方寫成松耦合,濫用設(shè)計(jì)模式,只會(huì)導(dǎo)致工作量增加和類泛濫!
所以,請(qǐng)所有的面試官們,如果你仍然為自己“懂”那么多設(shè)計(jì)模式而感覺高高在上,請(qǐng)停止你那些愚蠢的提問,因?yàn)楹芸赡芤粋€(gè)真正的程序猿就被你的無知給篩掉了。
設(shè)計(jì)模式體現(xiàn)在每一行追求完美的代碼中,而我們無須追尋!
謹(jǐn)以此文獻(xiàn)給那些總在力求讓自己的代碼更加優(yōu)美,更加易于業(yè)務(wù)擴(kuò)展的程序猿們。
總結(jié)
以上是生活随笔為你收集整理的我对设计模式不屑一顾的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Alfresco学习
- 下一篇: vue实现表格的‘模板下载‘功能