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

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

Facade,怎么可能只是提供简单的接口--

时间: 2024-08-30 07:00:09

Facade,怎么可能只是提供简单的接口--的相关文章

利用Java提供的Observer接口和Observable类实现观察者模式

对于观察者模式,其实Java已经为我们提供了已有的接口和类.对于订阅者(Subscribe,观察者)Java为我们提供了一个接口,JDK源码如下: 1 package java.util; 2 3 public interface Observer { 4 void update(Observable o, Object arg); 5 } 和我们上一篇实现的观察者一样,仅提供一个update方法用于接收通知者的通知做出相应改变. 我们再来看看Java为我们提供了一个怎样的通知者(Publish

Sea.js 提供简单、极致的模块化开发体验

http://seajs.org/docs/#intro 为什么使用 Sea.js ? Sea.js 追求简单.自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像 Node.js 一般书写模块代码. 自然直观的代码组织方式:依赖的自动加载.配置的简洁清晰,可以让我们更多地享受编码的乐趣. Sea.js 还提供常用插件,非常有助于开发调试和性能优化,并具有丰富的可扩展接口. 兼容性 Sea.js 具备完善的测试用例,兼容所有主流浏览器:

简单调用接口,就能快速查询飞机火车票信息

通过图灵机器人平台提供的免费接口就能实现查询,该API 提供智能聊天.智能问答.查天气.查公交出行.查附近周边等近500种功能,下面就简单说下列车请求示例,返回的参数是为json格式 详情可见图灵机器人官网的详细文档:http://www.tuling123.com/openapi/cloud/access_api.jsp 请求示例: http://www.tuling123.com/openapi/api?key=KEY&info=北京到拉萨的火车 { "code":3050

国家气象局提供的天气预报接口及使用说明

国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/101010100.html http://m.weather.com.cn/data/101010100.html 对于第三个接口,返回信息比较全面,也是以json格式提供,格式如下 {"weatherinfo": { //基本信息; "city"

如何简单实现接口自动化测试(基于 python) 原博主地址https://blog.csdn.net/gitchat/article/details/77849725

如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python) 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 一.简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测试框架pithy.期望读者可以通过本文对接口自动化测试有一个大致的了解. 二.引言

短信猫验证码接收解决方案(提供三款接口应用软件)

短信猫验证码方案介绍: 两个短信猫验证的应用场景: 1.网站验证码用户登录 目前在网络上各种网站.应用.平台登录都需要用到手机验证码,直接给用户手机发送验证码后才能进行登录等操作及大地提高了用户的安全性及降低了恶意注册的可能性. 2.网络营销账号注册 我们注册各类网站.APP.软件时均需要与用户手机号绑定才能使用相应的网站和软件功能,有这样一群以出售账号即通过专业的短信猫设备可大批量接收验证码的方式去注册海量账号从而提供给那些网络营销公司或个人,他们可拿来做营销宣传与推广,一个账号的价值不菲.

Swift是一个提供RESTful HTTP接口的对象存储系统

Swift是一个提供RESTful HTTP接口的对象存储系统,最初起源于Rackspace的Cloud Files,目的是为了提供一个和AWS S3竞争的服务. Swift于2010年开源,是OpenStack最初的两个项目之一.然而,在国内OpenStack圈里,不太能够听到关于Swift的声音,究其原因正如本系列的第一篇<文件系统vs对象存储——选型和趋势>)中所说的,RESTful HTTP接口的对象存储,主要为互联网应用服务,而OpenStack厂商最关心的传统行业的用户目前能够应用

国家气象局提供的天气预报接口

今天突然用到web服务接口对接 想了一下,Apache 的 CXF 可以发布发布服务的话应该也可以接收服务 然后就去尝试了一下,期间发生各种错误各种无奈 后来网上一查,查出下面的东东 顿时有股扇一耳光的冲动, 下面是国家气象局提供的天气预报接口  返回JSON格式文件,解析JSON文件数据就能得到你想要的啦 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/

简单的接口框架

日常开发中经常会用到接口,传输都基于http,.net下有简单的ashx或aspx等搭载接口或MVC下的WebApi,或Wcf等.. 之前开发中用到了Web轻型框架:Nancy,Json序列化工具ServiceStack.Text,于是将两者结合下构造一个我自己的小接口框架 一.服务端抽象 先上5个基本抽象类和接口 1.请求基类:可包含一些账户等信息 public class RequestBase { } 2.响应基类:包括响应状态 public class ResponseBase { pu