??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
public static void main(String[] args){
CommandLoader cl=new DefaultCommandLoader(new DefaultShowCommand());
cl.excute("executeShowList",null);
}
}
public interface CommandLoader {
void excute(String commandName,Object[] argument);
}
public class DefaultCommandLoader implements CommandLoader {
private ShowCommand showCommand;
private HashMap subCommandMap=new HashMap();
public DefaultCommandLoader(ShowCommand showCommand){
this.showCommand=showCommand;
init();
}
private void init() {
Method[] allMethod=this.showCommand.getClass().getMethods();
for(int i=0;i<allMethod.length;i++){
Method m=allMethod;
if(m.getName().startsWith("execute")){
subCommandMap.put(m.getName(), m);
}
}
}
public void excute(String commandName, Object[] argument) {
Method m=(Method) this.subCommandMap.get(commandName);
if(m==null){
throw new NullPointerException("not found command");
}
try{
m.invoke(this.showCommand,argument);
}
catch(Exception e){
throw new RuntimeException("Load command["+m.getName()+"error");
}
}
}
public interface ShowCommand {
public void executeShowList();
public void excuteShowString();
public void executeShowInteger();
public void executeShowLong();
}
public class DefaultShowCommand implements ShowCommand {
public void excuteShowString() {
System.out.println(String.class.getName());
}
public void executeShowInteger() {
System.out.println(Integer.class.getName());
}
public void executeShowList() {
System.out.println(List.class.getName());
}
public void executeShowLong() {
System.out.println(Long.class.getName());
}
}
]]>
Z么会业务逻辑层用if elseQ其实用者的目的也是Z重用Q但是这是面向过E编E的重用Q程序员只看C码重用,因ؓ他看到if else几种情况下大部分代码都是重复的,只有个别不同Q因此用if else可以避免重复代码Qƈ且认是模板Template模式?/p>
他范的错误是Q程序员只从代码q行序q个方向来看待它的代码,q种思维cM水管或串行电路,水沿着水管动Q代码运行次序)Q当遇到几个分管Q子)Q就分到q几个分子在流动,q里q当于到代码的if else处了?/p>
而用OOQ则首先打破q个代码׃向下序{同于运行时的先后@序这个规律,代码l构不由执行循序军_Q由什么决定呢Q由OO设计Q设计模式会取代q些if elseQ但是最后L׃个Service{ȝ按照q行序l装q些OO模块Q只有一处,q处可包含事务,一般就是ServiceQEJB中是Session bean?/p>
一旦需求变化,我们更多的可能是Service中各个OO模块Q甚x只改动Service中的OO模块执行序pW合需求?/p>
q里我们也看到OO分离的思\Q将以前q程语言的一个Main函数d分解Q将q行序与代码其他逻辑分离开来,而不是象面向q程那样混ؕ在一赗所以有人感慨,OO也是要顺序的Q这是肯定的Q关键是q行序要单独分d来?/p>
是否有if else可以看出你有没有运行顺序分d家?/p>
设计模式的切入口
l常有h反映Q设计模式是不错Q但是我很难用到Q其实如果你使用if else来写代码Ӟ除显C控制以外)Q就是在写业务逻辑Q只不过使用单的判断语句来作为现实情늚替代者?/p>
q是以大家熟悉的论坛帖子Z子,如ForumMessage是一个模型,但是实际中帖子分两种性质Q主题脓Q第一个根_和回帖(回以前帖子的帖子Q,q里有一个朴素的解决ҎQ?br />建立一个ForumMessageQ然后在ForumMessage加入isTopicq样判断语句Q注意,你这里一个简单属性的判断引入Q可能导致你的程序其他地方到处存在if else 的判断?/p>
如果我们改用另外一U分析实现思\Q以对象化概늜待,实际中有主题贴和回帖Q就是两U对象,但是q两U对象大部分是一致的Q因此,我将ForumMessage设ؓ表达主题_然后创徏一个承ForumMessage的子cForumMessageReply作ؓ回帖Q这P我在E序地方Q如Service中,我已l确定这个Model是回帖了Q我q接下溯ؓForumMessageReply卛_Q这个有点类似向Collection攑օ对象和取出时的强制类型{换。通过q个手段我消灭了以后E序中if else的判断语句出现可能?/p>
从这里体CQ如果分析方向错误,也会D误用模式?/p>
讨论设计模式举例Q不能没有业务上下文场景的案例,否则无法军_是否该用模式Q下面D两个Ҏ的例子:
W一. q个帖子中D例的W一个代码案例是没有上下文的Q文中只说明有一D代码:
main() {
ifQcase AQ{ //do with strategy A }else(case B){ //do with strategy B }else(case C){ //do with strategy C } } |
q段代码只是Ua的代码,没有业务功能Q所以,在这U情况下Q我们就很难定使用什么模式,是一定用{略模式{,也逃不q还是用if else的命q,设计模式不是法Q不能将一D|无意义的代码变得单了Q只能将其体现的业务功能更加Ҏ可拓展了?/p>
W二.?a target="_blank">q个帖子中,作者D了一个PacketParser业务案例Q这D代码是体现业务功能的,是一个数据包的分析,作者也比较了各U模式用的不同Q所以我们还是用动态代理模式或Command模式来消灭那些可能存在的if else
׃上两个案例表明:业务逻辑是我们用设计模式的切入点,而在分解业务逻辑Ӟ我们习惯则可能用if else来实玎ͼ当你有这U企图或者已l实C码了Q那么就应该考虑是否需要重构Refactoring了?br />
if else替代?/strong>
那么实战中,哪些设计模式可以替代if else呢?其实GoF设计模式都可以用来替代if elseQ我们分别描q如下:
public class Order{ private int status; //说明Q? //status=1 表示订货但ؓ查看 Q?/p> //status=2 表示已经查看未处理; //status=3 表示已经处理未付?/p> //status=4 表示已经付款未发?/p> //status=5 表示已经发货 } |
OO设计的ȝ
q有一U伪模式Q虽然用了状态等模式Q但是在模式内部实质q是使用if else或switchq行状态切换或重要条g判断Q那么无疑说明还需要进一步努力。更重要的是Q不能以模式自居Q而且ZCZh?/p>
真正掌握面向对象q些思想是一件困隄事情Q目前有各种属于揪着自己头发向上拔的解说Q都是误人子弟的Q所以我觉得初学者读Thinking in JavaQJava~程思想Q是没有用,它试图从语言层次来讲OO~程思想Q非常失败,作ؓ语言参考书可以Q但是作为Java体现的OO思想的学习资料,错了?/p>
OO~程思想是一U方法论Q方法论如果没有应用比较Q是无法体会q个Ҏ论的特点的,是古代一个方法论Q悟是靠挑水砍柴这些应用才能体会?/p>
那么OO思想靠什么应用能够体会到了?是GoF设计模式QGoF设计模式是等于Y件h员的挑水砍柴{基本活Q所以,如果一个程序员q基本活都不会,他何以自居OOE序员?从事OO专业设计~程q个工作Q如果不掌握设计模式基本功,p一个做和尚的h不愿意挑水砍_他何以立个行业?早就被师傅赶下山?/p>
最后ȝQ将if else用在地方还可以Q如单的数值判断;但是如果按照你的传统习惯思维Q在实现业务功能时也使用if elseQ那么说明你的思维可能需要重塑,你的~程l验丰富,传统q程思维模式容易根p固,想靠自己改变很困难;接受专业头脑风暴培训?/p>
用一句话ȝQ如果你做了不少pȝQ很久没有用if else了,那么说明你可能真正进入OO设计的境C。(q是本h自己发明的实战性的衡量考核标准Q?/p>
1. 常用快捷?br />(1)Ctrl+Space
说明:内容助理。提供对Ҏ,变量,参数,javadoc{得提示,应运在多U场?M需要提C的时候可先按此快捷键?br />?避免输入法的切换讄与此讄冲突
(2)Ctrl+Shift+Space
说明:变量提示
(3)Ctrl+/
说明:d/消除//注释,在eclipse2.0?消除注释为Ctrl+\
(4)Ctrl+Shift+/
说明:d/* */注释
(5)Ctrl+Shift+\
说明:消除/* */注释
(6)Ctrl+Shift+F
说明:自动格式化代?/p>
(7)Ctrl+1
说明:扚w修改源代码中的变量名,此外q可用在catch块上.
(8)Ctril+F6
说明:界面切换
(9)Ctril+Shift+M
说明:查找所需要得?/p>
(10)Ctril+Shift+O
说明:自动引入所需要得?/p>
(11)Ctrl+Alt+S
说明:源代码得快捷菜单。其中的Generate getters and setters ?Surround with try/catch
block比较常用.把它们添加ؓ快捷?快捷键设|在windows->preferences->Workbench->Keys
2. 快捷键列?/p>
~辑
作用?功能 快捷?br />全局 查找q替?Ctrl+F
文本~辑?查找上一?Ctrl+Shift+K
文本~辑?查找下一?Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+?br />全局 剪切 Ctrl+X
全局 快速修?Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信?Alt+QAlt+Shift+?Ctrl+Shift+Space
Java~辑?昄工具提示描述 F2
Java~辑?选择装元素 Alt+Shift+?br />Java~辑?选择上一个元?Alt+Shift+?br />Java~辑?选择下一个元?Alt+Shift+?br />文本~辑?增量查找 Ctrl+J
文本~辑?增量逆向查找 Ctrl+Shift+J
全局 _脓 Ctrl+V
全局 重做 Ctrl+Y
查看
作用?功能 快捷?br />全局 攑֤ Ctrl+=
全局 ~小 Ctrl+-
H口
作用?功能 快捷?br />全局 Ȁzȝ辑器 F12
全局 切换~辑?Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视?Ctrl+Shift+F7
全局 上一个透视?Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视?Ctrl+F7
全局 下一个透视?Ctrl+F8
文本~辑?昄标尺上下文菜?Ctrl+W
全局 昄视图菜单 Ctrl+F10
全局 昄pȝ菜单 Alt+-
D
作用?功能 快捷?br />Java~辑?打开l构 Ctrl+F3
全局 打开cd Ctrl+Shift+T
全局 打开cd层次l构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+?br />全局 前进历史记录 Alt+?br />全局 上一?Ctrl+,
全局 下一?Ctrl+.
Java~辑?昄大纲 Ctrl+O
全局 在层ơ结构中打开cd Ctrl+Shift+H
全局 转至匚w的括?Ctrl+Shift+P
全局 转至上一个编辑位|?Ctrl+Q
Java~辑?转至上一个成?Ctrl+Shift+?br />Java~辑?转至下一个成?Ctrl+Shift+?br />文本~辑?转至?Ctrl+L
搜烦
作用?功能 快捷?br />全局 出现在文件中 Ctrl+Shift+U
全局 打开搜烦对话?Ctrl+H
全局 工作Z的声?Ctrl+G
全局 工作Z的引?Ctrl+Shift+G
文本~辑
作用?功能 快捷?br />文本~辑?改写切换 Insert
文本~辑?上滚?Ctrl+?br />文本~辑?下滚?Ctrl+?/p>
文g
作用?功能 快捷?br />全局 保存 Ctrl+X Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属?Alt+Enter
全局 新徏 Ctrl+N
目
作用?功能 快捷?br />全局 全部构徏 Ctrl+B
源代?br />作用?功能 快捷?br />Java~辑?格式?Ctrl+Shift+F
Java~辑?取消注释 Ctrl+\
Java~辑?注释 Ctrl+/
Java~辑?d导入 Ctrl+Shift+M
Java~辑?l织导入 Ctrl+Shift+O
Java~辑?使用try/catch块来包围 未设|,太常用了Q所以在q里列出,自己讄。也可以使用Ctrl+1自动修正?/p>
q行
作用?功能 快捷?br />全局 单步q回 F7
全局 单步跌 F6
全局 单步跛_ F5
全局 单步跛_选择 Ctrl+F5
全局 调试上次启动 F11
全局 l箋 F8
全局 使用qo器单步执?Shift+F5
全局 d/去除断点 Ctrl+Shift+B
全局 昄 Ctrl+D
全局 q行上次启动 Ctrl+F11
全局 q行臌 Ctrl+R
全局 执行 Ctrl+U
重构
作用?功能 快捷?br />全局 撤销重构 Alt+Shift+Z
全局 抽取Ҏ Alt+Shift+M
全局 抽取局部变?Alt+Shift+L
全局 内联 Alt+Shift+I
全局 Ud Alt+Shift+V
全局 重命?Alt+Shift+R
全局 重做 Alt+Shift+Y