設計模式應用(多個if的處理)


使用場景

如果在代碼中出現大量if判斷,再執行一些比較復雜的業務操作,類似於以下情況。

    @Test
    void test() {
        String str = "A";
        if (str.equals("A")) {
            System.out.println("A的方法1");
        } else if (str.equals("B")) {
            System.out.println("B的方法1");
        }
    }

此時如果使用if的重復判斷,則代碼過於冗長。

解決方法

采用工廠模式,策略模式,模版方法設計模式
1、創建一個抽象類,實現InitializingBean接口,由if對應條件的子類來實現

/**
 * 模版方法設計模式
 */
public abstract class FunService implements InitializingBean {
    public void fun1() {
        throw new UnsupportedOperationException();
    }

    public void fun2() {
        throw new UnsupportedOperationException();
    }
}

2、子類實現


import com.example.demo.manage.FunFactory;
import com.example.demo.service.FunService;
import org.springframework.stereotype.Service;

@Service
public class AService extends FunService {

    @Override
    public void fun1() {
        System.out.println("A的方法1");
    }

    @Override
    public void fun2() {
        System.out.println("A的方法2");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        FunFactory.register("A", this);

    }
}

InitializingBean接口
方法afterPropertiesSet 是在類中的屬性被注入后,再執行,一般用於對不可注入的類變量進行定義。

3、定義工廠,和策略的map

/**
 * 工廠模式 策略模式
 */
public class FunFactory {
    private static Map<String, FunService> map = new HashMap<>();


    public static FunService getService(String str) {
        return map.get(str);
    }

    public static void register(String str, FunService service) {
        if (StringUtils.isEmpty(str) || Objects.isNull(service)) return;
        map.put(str, service);
    }
}

在所有實現類的afterPropertiesSet方法中,向工廠注冊。
4、執行

    @Test
    void contextLoads() {
        String str = "A";
        FunService service = FunFactory.getService(str);
        service.fun1();
    }

小節

改進后的代碼符合開閉原則,即是對於新的條件,只需要添加一個javabean,而不需言重新修改代碼。

git 地址

https://github.com/lexiaoyao1995/design_mode


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM