博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Facade,怎么可能只是提供简单的接口--
阅读量:5036 次
发布时间:2019-06-12

本文共 6387 字,大约阅读时间需要 21 分钟。

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

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

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
OLYMPUS = new ArrayList
() { { 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
OLYMPUS = new ArrayList
() { { 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猫,也放不了他的大招...

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

转载于:https://www.cnblogs.com/liuCy/p/3860264.html

你可能感兴趣的文章
Android中的Parcelable接口
查看>>
ebs 请求中选值集信息时报APP-FND-01564: ORACLE error 24345 in fdlget
查看>>
js动态规划---背包问题
查看>>
lua 中处理cocos2dx 的button 事件
查看>>
PageUtil 分页
查看>>
基于.NET的3D开发框架/工具比较
查看>>
Mac item2常用快捷键
查看>>
转!mysql备份与还原数据库
查看>>
Python基础——数据类型、流程控制、常用函数
查看>>
近期在用Gvim,默认样式比较难看,现在调整了一下
查看>>
关于框架的一些学习笔记
查看>>
vSphere中Storage vMotion的流程详解
查看>>
Docker-Mysql-proxy Mysql Proxy实现读写分离
查看>>
mysql 的基本使用命令
查看>>
字符串排序之一
查看>>
判断三角形类型方法的单元测试
查看>>
C++学习笔记51:排序
查看>>
spring.factories
查看>>
php使用amqplib方式使用rabbitmq
查看>>
打印控件
查看>>