標籤:style blog color 使用 io 問題
分層是軟體解決問題的基本方法....不過僅僅一個分層就算一個設計模式的話...別鬧了
栗子:貝爺在奧林匹斯山上抓動物
1.奧林匹斯山上生物的介面
public interface God { public String power(); public String getName();}
2.奧林匹斯山上的生物
public class Apollo implements God { public String power() { return "亂搞"; } public void plague() { System.out.println("阿波羅開始傳播瘟疫"); } public String getName() { return "阿波羅"; }}public class Ares implements God { public String power() { return "調戲"; } public void war(){ System.out.println("阿瑞斯開始挑起戰爭"); } public String getName() { return "阿瑞斯"; }}public class Zeus implements God { public String power() { return "閃電"; } public void doomsday(){ System.out.println("宙斯引發了世界末日"); } public String getName() { return "宙斯"; }}
3.貝爺和他的技能
public class Bill {public void executecatch(){ int num=(int)(Math.random()*World.OLYMPUS.size()); God prey = World.OLYMPUS.get(num); System.out.print("貝爺抓住了"+prey.getName()); System.out.print("-------------貝爺擁有了他俘虜的力量:"+prey.power());}}
4.世界/情境
public class World { //這個世界上的神 static final List<God> OLYMPUS = new ArrayList<God>() { { add(new Zeus()); add(new Apollo()); add(new Ares()); } }; static final Bill bill=new Bill(); public static void main(String[] args) throws InterruptedException { while(true){ bill.executecatch(); Thread.sleep(1000); } }}
情境1:貝爺正常的進行捕捉
貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電貝爺抓住了阿波羅-------------貝爺擁有了他俘虜的力量:亂搞貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電
情境2:貝爺嘗試與他的俘虜交流,一次來擷取更多資訊
此時,貝爺的技能稍作修改
public class Bill {public void executecatch(){ int num=(int)(Math.random()*World.OLYMPUS.size()); God prey = World.OLYMPUS.get(num); System.out.print("貝爺抓住了"+prey.getName()); System.out.print("-------------貝爺擁有了他俘虜的力量:"+prey.power()); System.out.println("++++++++++++貝爺知道了他的獵物的真身:"+prey.getClass());}}
而結果就變成:
貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.Zeus貝爺抓住了阿波羅-------------貝爺擁有了他俘虜的力量:亂搞++++++++++++貝爺知道了他的獵物的真身:class god.Apollo貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.Ares貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.Ares貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.Zeus貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.Ares貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.Ares
情境3:既然擷取了真身,貝爺當然要嘗試著讓他的俘虜做更多的事,so
貝爺變為:
public void executecatch(){ int num=(int)(Math.random()*World.OLYMPUS.size()); God prey = World.OLYMPUS.get(num); System.out.print("貝爺抓住了"+prey.getName()); System.out.print("-------------貝爺擁有了他俘虜的力量:"+prey.power()); System.out.print("++++++++++++貝爺知道了他的獵物的真身:"+prey.getClass()); if(prey instanceof Zeus){ Zeus zeus=(Zeus)prey; System.out.print("////////////貝爺讓他的俘虜"+prey.getName()+"釋放了自己的秘籍:"); zeus.doomsday(); }else if(prey instanceof Apollo){ Apollo apollo=(Apollo)prey; System.out.print("////////////貝爺讓他的俘虜"+prey.getName()+"釋放了自己的秘籍:"); apollo.plague(); }else if(prey instanceof Ares){ Ares ares=(Ares)prey; System.out.print("////////////貝爺讓他的俘虜"+prey.getName()+"釋放了自己的秘籍:"); ares.war(); }else{ System.out.println("貝爺需要進一步分析俘虜"); }}}
結果變成了:
貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.Ares////////////貝爺讓他的俘虜阿瑞斯釋放了自己的秘籍:阿瑞斯開始挑起戰爭貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.Zeus////////////貝爺讓他的俘虜宙斯釋放了自己的秘籍:宙斯引發了世界末日貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.Zeus////////////貝爺讓他的俘虜宙斯釋放了自己的秘籍:宙斯引發了世界末日貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.Zeus////////////貝爺讓他的俘虜宙斯釋放了自己的秘籍:宙斯引發了世界末日貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.Zeus////////////貝爺讓他的俘虜宙斯釋放了自己的秘籍:宙斯引發了世界末日貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.Ares////////////貝爺讓他的俘虜阿瑞斯釋放了自己的秘籍:阿瑞斯開始挑起戰爭貝爺抓住了阿波羅-------------貝爺擁有了他俘虜的力量:亂搞++++++++++++貝爺知道了他的獵物的真身:class god.Apollo////////////貝爺讓他的俘虜阿波羅釋放了自己的秘籍:阿波羅開始傳播瘟疫
這種情況下還能不能快樂的玩耍,只是讓你去抓獵物,為什麼獵物的大招你都會了?
為了不讓貝爺擁有過多技能,我們只能給奧林帕斯山上的生物一個替身-》Facade
引入Facade:
1.首先要有Facade
public class GodFacade implements God{ private God god=null; public GodFacade(God god) { super(); this.god = god; } public String power() { return god.power(); } public String getName() { return god.getName(); }}
2.開始使用Facade
public class World { //這個世界上的神 static final List<God> OLYMPUS = new ArrayList<God>() { { add(new GodFacade(new Zeus())); add(new GodFacade(new Apollo())); add(new GodFacade(new Ares())); } }; static final Bill bill=new Bill(); public static void main(String[] args) throws InterruptedException { while(true){ bill.executecatch(); Thread.sleep(1000); } }}
最終運算結果:
貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了阿波羅-------------貝爺擁有了他俘虜的力量:亂搞++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了阿瑞斯-------------貝爺擁有了他俘虜的力量:調戲++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了阿波羅-------------貝爺擁有了他俘虜的力量:亂搞++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了宙斯-------------貝爺擁有了他俘虜的力量:閃電++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜貝爺抓住了阿波羅-------------貝爺擁有了他俘虜的力量:亂搞++++++++++++貝爺知道了他的獵物的真身:class god.GodFacade貝爺需要進一步分析俘虜
好了,世界安靜了,貝爺再也無法使用獵物們的大招了。。。。
或許我們可以簡單的發現,Facade沒有讓真的讓使用變簡單,反而還要多增加幾部,而且他最終防禦的竟然是貝爺(其他程式猿)
如果你這麼認為,我們可以簡單的聊一下
物件導向的基本特徵是什麼?繼承,封裝和多態,那麼更方便的使用算什麼?如何是封裝如何能稱的上模式?
也許我們可以這樣認為,能夠強化或弱化繼承,封裝,多態,達到更好的使用物件導向的方式,都他喵的叫設計模式
Facade,解決了封裝+繼承的開放資訊問題,或許在一般的項目中,這貨沒有存在的意義,畢竟多知道一點更方便任務的完成和調用,但是如果是給其他猿類使用亦或者架構什麼的呢?表示不清?
朝三暮四說的就是猿類,沒栗子,不明白
栗子:隨便建個web項目,建個servlet,在doGet方法中加上System.out.println(request.getClass());你就會看見
class org.apache.catalina.connector.RequestFacade
即使貝爺抓住了tom貓,也放不了他的大招...
那麼接下來,趕緊去試試自己項目架構中提供的類介面的真身是什麼,有福利哦