Facade,怎麼可能只是提供簡單的介面--

來源:互聯網
上載者:User

標籤: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貓,也放不了他的大招...

那麼接下來,趕緊去試試自己項目架構中提供的類介面的真身是什麼,有福利哦

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.