else 策略模式去掉if_如何用卫语句、策略模式、状态模式重构if-else语句
《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
總結
以上是生活随笔為你收集整理的else 策略模式去掉if_如何用卫语句、策略模式、状态模式重构if-else语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脑回路是什么意思 脑回路的意思
- 下一篇: 数仓建模 项目_模型设计_数仓建模 PD