zoukankan      html  css  js  c++  java
  • Facade,怎么可能只是提供简单的接口--

    分层是软件解决问题的基本方法....不过仅仅一个分层就算一个设计模式的话...别闹了

    栗子:贝爷在奥林匹斯山上抓动物

    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猫,也放不了他的大招...

    那么接下来,赶紧去试试自己项目框架中提供的类接口的真身是什么,有福利哦

  • 相关阅读:
    更改Ubuntu默认python版本的方法
    hdu 5656 CA Loves GCD(dp)
    hdu 5655 CA Loves Stick
    hdu 5650 so easy (异或)
    2016.3.28
    Android 之 ExpandableListView 的使用
    Android之字符串的拆分-split
    Android之SAX解析XML
    hdu 5642 King's Order(数位dp)
    hdu 5641 King's Phone(暴力模拟题)
  • 原文地址:https://www.cnblogs.com/liuCy/p/3860264.html
Copyright © 2011-2022 走看看