《java开发手册》中:
况且日常开发时遇到一推的if-else着实让人头疼!
so,现在开始改造
一、卫语句
卫语句就是把复杂的条件表达式拆分成多个条件表达式,即代码逻辑先考虑失败、异常、中断、退出等直接返回的情况,以方法多个出口的方式,解决代码中判断分支嵌套的问题,这是逆向思维的体现
比如:
if (type == 0) { code... }else if (type == 1) { code... } else if (type == 2) { code... } else { otherCode... }
可以改造为:
if (type == 0) { code... return; } if (type == 1) { code... return; } if (type == 2) { code... return; } otherCode....
二、策略模式
如果不了解策略模式,可以去看下菜鸟教程中的例子,简单明了,地址:https://www.runoob.com/design-pattern/strategy-pattern.html
现在有个需求,根据用户的类型来展示不同的内容,我们将其具体化为一段代码:
if ("新客户".equals(userType)) { showNewContent...; }else if("VIP客户".equals(userType)){ showVIPContent...; }else if ("白金客户".equals(userType)) { showPlatinaContent...; }else if ("黑卡用户".equals(userType)){ showBlackCardContent...; }else if ("回归用户".equals(userType)){ showComeBackContent...; }else { showOtherContent...; }
这样看是看不出来有何不妥的,但是想想,要推荐的内容何止这么点代码,如果不管不顾,就这么写,到时候写完代码回过头来,自己都得看老半天才能看懂,何论后期维护的人呢,而且要是后期又添加了一种新的用户类型,那是不是又要写一个else-if插在中间,然后又增量添加一推代码,这样岂不是太麻烦了?,反正强迫症肯定是受不了的
策略模式改造:
1.定义一个策略接口
public interface ShowStrategy{ void showContentByUserType(); }
2.定义多个具体的策略实现
public class ShowNewContentStrategy implements ShowStrategy { @Override public void showContentByUserType() { System.out.println("展示新用户内容"); } } public class ShowVIPContentStrategy implements ShowStrategy { @Override public void showContentByUserType() { System.out.println("展示VIP用户内容"); } } public class ShowPlatinaContentStrategy implements ShowStrategy { @Override public void showContentByUserType() { System.out.println("展示白金用户内容"); } } public class ShowBlackCardContentStrategy implements ShowStrategy { @Override public void showContentByUserType() { System.out.println("展示黑卡用户内容"); } } public class ShowComeBackContentStrategy implements ShowStrategy { @Override public void showContentByUserType() { System.out.println("展示回归用户内容"); } }
3.定义一个策略使用的client
public class ShowStrategyClient { //持有一个策略接口引用 private ShowStrategy showStrategy; //注入 public ShowStrategyClient(ShowStrategy showStrategy) { this.showStrategy = showStrategy; } //策略client的方法 public void clientMethod(){ showStrategy.showContentByUserType(); } }
4.外部使用
回到我们的需求,用写好的策略模式重构
public void test() { //1.创建新用户的内容展示策略 ShowStrategy newContentStrategy = new ShowNewContentStrategy(); //2.创建策略客户端,注入新用户策略实现 ShowStrategyClient showStrategyClient = new ShowStrategyClient(newContentStrategy); showStrategyClient.clientMethod(); }
三、状态模式
继续引用我们在“二、策略模式”中的例子
状态模式改造:
1.定义一个状态行为接口
interface UserState { void showNewContent(ShowStateClient client); void showVIPContent(ShowStateClient client); void showPlatinaContent(ShowStateClient client); void showBlackCardContent(ShowStateClient client); void showComeBackContent(ShowStateClient client); }
2.定义多个具体的状态实现
public class ShowNewContentState implements UserState { @Override public void showNewContent(ShowStateClient client) { System.out.println("展示新用户内容"); } @Override public void showVIPContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showPlatinaContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showBlackCardContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showComeBackContent(ShowStateClient client) { System.out.println("用户状态错误"); } } public class ShowVIPContentState implements UserState { @Override public void showNewContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showVIPContent(ShowStateClient client) { System.out.println("展示VIP用户内容"); } @Override public void showPlatinaContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showBlackCardContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showComeBackContent(ShowStateClient client) { System.out.println("用户状态错误"); } } public class ShowPlatinaContentState implements UserState { @Override public void showNewContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showVIPContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showPlatinaContent(ShowStateClient client) { System.out.println("展示白金用户内容"); } @Override public void showBlackCardContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showComeBackContent(ShowStateClient client) { System.out.println("用户状态错误"); } } public class ShowBlackCardContentState implements UserState { @Override public void showNewContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showVIPContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showPlatinaContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showBlackCardContent(ShowStateClient client) { System.out.println("展示黑卡用户内容"); } @Override public void showComeBackContent(ShowStateClient client) { System.out.println("用户状态错误"); } } public class ShowComeBackContentState implements UserState { @Override public void showNewContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showVIPContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showPlatinaContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showBlackCardContent(ShowStateClient client) { System.out.println("用户状态错误"); } @Override public void showComeBackContent(ShowStateClient client) { System.out.println("展示回归用户内容"); } }
3.定义一个状态使用的client
public class ShowStateClient { private UserState userState; public void setUserState(UserState userState){ this.userState = userState; } public UserState getUserState(){ return userState; } public void showNewContent() { userState.showNewContent(this); } public void showVIPContent() { userState.showVIPContent(this); } public void showPlatinaContent() { userState.showPlatinaContent(this); } public void showBlackCardContent() { userState.showBlackCardContent(this); } public void showComeBackContent() { userState.showComeBackContent(this); }}
4.外部使用
public static void main(String[] args) { ShowStateClient client = new ShowStateClient(); client.setUserState(new ShowNewContentState()); client.showNewContent(); client.showVIPContent(); client.showPlatinaContent(); client.showBlackCardContent(); client.showComeBackContent();}
个人觉得状态模式过于臃肿,用处反而没有特别突出,不过也许是我没有遇到合适的场景或者理解有误吧!