《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....
二、策略模式
现在有个需求,根据用户的类型来展示不同的内容,我们将其具体化为一段代码:
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();
}
个人觉得状态模式过于臃肿,用处反而没有特别突出,不过也许是我没有遇到合适的场景或者理解有误吧!
标签:语句,void,System,模式,用卫,client,println,ShowStateClient,public
来源: https://www.cnblogs.com/yibeijingdoujiang/p/11393380.html