分层是软件解决问题的基本方法....不过仅仅一个分层就算一个设计模式的话...别闹了
栗子:贝爷在奥林匹斯山上抓动物
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猫,也放不了他的大招...
那么接下来,赶紧去试试自己项目框架中提供的类接口的真身是什么,有福利哦