Java函數(shù)式編程實戰(zhàn)之策略工廠

前言

Java 8 函數(shù)式編程可以簡化傳統(tǒng)設(shè)計模式使用方式怔蚌,下面看兩個重構(gòu)例子是目,用Functional Interface 實現(xiàn)策略工廠单起。

案例一


  • 原始實現(xiàn):
switch (agreementBuildItem.getSignNaturalType()) {
            case LEGAL_PERSON:
                party = newParty(company.getLegalPerson());
                break;
            case LEGAL_PERSON_SPOUSE:
                party = newParty(company.getLegalPerson().getSpouse());
                break;
            case ACTUAL_CONTROLLER:
                party = newParty(company.getActualController());
                break;
            case ACTUAL_CONTROLLER_SPOUSE:
                party = newParty(company.getActualController().getSpouse());
                break;
            case LEGAL_PERSON_ALIPAY_ACCOUNT:
                party = newParty(company.getLegalPerson().getAlipayAccountData());
                break;
            case ACTUAL_CONTROLLER_ALIPAY_ACCOUNT:
                party = newParty(company.getActualController().getAlipayAccountData());
                break;
            case COMPANY_TRADE_ALIPAY_ACCOUNT:
                party = newParty(company.getAlipayAccountMap().get("TRADE_ALIPAY_ACCOUNT"));
                break;
            default:
                throw new UnsupportedOperationException();
        }



  • 重構(gòu)后實現(xiàn):

/**
 * @author zhengyu.nie
 * 2020/11/24.
 */
public final class PartyFactory {
    private PartyFactory() {}

    private static final Function<Company, Optional<Party>> LEGAL_PERSON_PARTY_FUNC = company
        -> newParty(company.getLegalPerson());

    private static final Function<Company, Optional<Party>> LEGAL_PERSON_SPOUSE_PARTY_FUNC = company
        -> newParty(company.getLegalPerson().getSpouse());

    private static final Function<Company, Optional<Party>> ACTUAL_CONTROLLER_PARTY_FUNC = company
        -> newParty(company.getActualController());

    private static final Function<Company, Optional<Party>> ACTUAL_CONTROLLER_SPOUSE_PARTY_FUNC = company
        -> newParty(company.getActualController().getSpouse());

    private static final Function<Company, Optional<Party>> LEGAL_PERSON_ALIPAY_PARTY_FUNC = company
        -> newParty(company.getLegalPerson().getAlipayAccountData());

    private static final Function<Company, Optional<Party>> ACTUAL_CONTROLLER_ALIPAY_PARTY_FUNC = company
        -> newParty(company.getActualController().getAlipayAccountData());

    private static final Function<Company, Optional<Party>> COMPANY_TRADE_ALIPAY_ACCOUNT_PARTY_FUNC = company
        -> newParty(company.getAlipayAccountMap().get("TRADE_ALIPAY_ACCOUNT"));

    private static final Map<SignNaturalType, Function<Company, Optional<Party>>> PARTY_FUNC_MAP = Maps.newHashMap();

    static {
        PARTY_FUNC_MAP.put(SignNaturalType.LEGAL_PERSON, LEGAL_PERSON_PARTY_FUNC);
        PARTY_FUNC_MAP.put(SignNaturalType.LEGAL_PERSON_SPOUSE, LEGAL_PERSON_SPOUSE_PARTY_FUNC);
        PARTY_FUNC_MAP.put(SignNaturalType.ACTUAL_CONTROLLER, ACTUAL_CONTROLLER_PARTY_FUNC);
        PARTY_FUNC_MAP.put(SignNaturalType.ACTUAL_CONTROLLER_SPOUSE, ACTUAL_CONTROLLER_SPOUSE_PARTY_FUNC);
        PARTY_FUNC_MAP.put(SignNaturalType.LEGAL_PERSON_ALIPAY_ACCOUNT, LEGAL_PERSON_ALIPAY_PARTY_FUNC);
        PARTY_FUNC_MAP.put(SignNaturalType.ACTUAL_CONTROLLER_ALIPAY_ACCOUNT, ACTUAL_CONTROLLER_ALIPAY_PARTY_FUNC);
        PARTY_FUNC_MAP.put(SignNaturalType.COMPANY_TRADE_ALIPAY_ACCOUNT, COMPANY_TRADE_ALIPAY_ACCOUNT_PARTY_FUNC);
    }

    public static Optional<Party> getParty(Company company, SignNaturalType signNaturalType) {
        Function<Company, Optional<Party>> companyOptionalFunction = PARTY_FUNC_MAP.get(signNaturalType);

        if (companyOptionalFunction == null) {
            throw new UnsupportedOperationException();
        }

        Optional<Party> party = companyOptionalFunction.apply(company);

        return party;
    }
}


案例二

  • 原始實現(xiàn)
  public CreditSchema convertToCreditSchema(CreditSchemaDTO creditSchemaDto) {
        CreditSchemaBuilder creditSchemaBuilder = CreditSchema.builder();
        creditSchemaBuilder.creditNo(creditSchemaDto.getCreditNo());
        creditSchemaBuilder.fgNo(creditSchemaDto.getFgNo());
        creditSchemaBuilder.institutionCreditNo(creditSchemaDto.getInstitutionCreditNo());
        creditSchemaBuilder.institutionCreditQuotaNo(creditSchemaDto.getInstitutionCreditQuotaNo());
        creditSchemaBuilder.riskCreditNo(creditSchemaDto.getRiskCreditNo());


        creditSchemaDto.getFactors().forEach(factor -> {
                if (factor instanceof RepaymentDayFactor) {
                    RepaymentDayFactor repaymentDayFactor = (RepaymentDayFactor)factor;
                    creditSchemaBuilder.repaymentDay(repaymentDayFactor.getRepaymentDay());
                }
                if (factor instanceof RepaymentMethodFactor) {
                    RepaymentMethodFactor repaymentMethodFactor = (RepaymentMethodFactor)factor;
                    creditSchemaBuilder.repaymentMethod(repaymentMethodFactor.getValue().name());
                }
                if (factor instanceof InterestRateFactor) {
                    InterestRateFactor interestRateFactor = (InterestRateFactor)factor;
                    creditSchemaBuilder.interestRate(interestRateFactor.getValue());
                }
                ………………
            }
        );

        return creditSchemaBuilder.build();
    }


  • 重構(gòu)后實現(xiàn)
    public CreditSchema convertToCreditSchema(CreditSchemaDTO creditSchemaDto) {
        CreditSchemaBuilder creditSchemaBuilder = CreditSchema.builder();
        creditSchemaBuilder.creditNo(creditSchemaDto.getCreditNo());
        creditSchemaBuilder.fgNo(creditSchemaDto.getFgNo());
        creditSchemaBuilder.institutionCreditNo(creditSchemaDto.getInstitutionCreditNo());
        creditSchemaBuilder.institutionCreditQuotaNo(creditSchemaDto.getInstitutionCreditQuotaNo());

        creditSchemaDto.getFactors().forEach(factor -> creditResultFactorAccessor.access(creditSchemaBuilder, factor));

        return creditSchemaBuilder.build();
    }

/**
 * @author zhengyu.nie
 * 2020/11/9.
 */
@Component
class CreditResultFactorAccessor {

    private static final BiConsumer<CreditSchemaBuilder, RepaymentMethodFactor> CREDIT_SCHEMA_FACTOR
        = (creditSchemaBuilder, repaymentMethodFactor) ->
        creditSchemaBuilder.repaymentMethod(String.valueOf(repaymentMethodFactor.getValue()));

    private static final BiConsumer<CreditSchemaBuilder, InterestRateFactor> INTEREST_RATE_FACTOR
        = (creditSchemaBuilder, interestRateFactor) -> {
        creditSchemaBuilder.interestUnit(String.valueOf(interestRateFactor.getUnit()));
        creditSchemaBuilder.interestRate(interestRateFactor.getValue());
    };

    private static final BiConsumer<CreditSchemaBuilder, LoanTermFactor> CREDIT_SCHEMA_LOAN_TERM_FACTOR
        = (creditSchemaBuilder, loanTermFactor) -> {
        creditSchemaBuilder.loanTermUnit(String.valueOf(loanTermFactor.getUnit()));
        creditSchemaBuilder.loanTerm(loanTermFactor.getValue());
    };

    private static final BiConsumer<CreditSchemaBuilder, ExpirationFactor> CREDIT_SCHEMA_EXPIRATION_FACTOR
        = (creditSchemaBuilder, expirationFactor) -> {
        creditSchemaBuilder.creditStartTime(expirationFactor.getStartTime());
        creditSchemaBuilder.creditEndTime(expirationFactor.getEndTime());
    };

    private static final BiConsumer<CreditSchemaBuilder, RepaymentDayFactor> LOAN_SCHEMA_REPAYMENT_DAY_FACTOR
        = (creditSchemaBuilder, repaymentDayFactor) -> creditSchemaBuilder.repaymentDay(
        repaymentDayFactor.getRepaymentDay());

    private static final Map<FactorTypeEnum, BiConsumer> consumerMap = new HashMap<>();

    static {
        consumerMap.put(FactorTypeEnum.REPAYMENT_METHOD, CREDIT_SCHEMA_FACTOR);
        consumerMap.put(FactorTypeEnum.INTEREST_RATE, INTEREST_RATE_FACTOR);
        consumerMap.put(FactorTypeEnum.LOAN_TERM, CREDIT_SCHEMA_LOAN_TERM_FACTOR);
        consumerMap.put(FactorTypeEnum.REPAYMENT_DAY, LOAN_SCHEMA_REPAYMENT_DAY_FACTOR);
        consumerMap.put(FactorTypeEnum.EXPIRATION_DATE, CREDIT_SCHEMA_EXPIRATION_FACTOR);
    }

    public void access(CreditSchemaBuilder creditSchemaBuilder, Factor factor) {
        if (consumerMap.containsKey(factor.getFactorType())) {
            consumerMap.get(factor.getFactorType()).accept(creditSchemaBuilder, factor);
        }
    }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末东囚,一起剝皮案震驚了整個濱河市浴麻,隨后出現(xiàn)的幾起案子够吩,更是在濱河造成了極大的恐慌比然,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周循,死亡現(xiàn)場離奇詭異强法,居然都是意外死亡,警方通過查閱死者的電腦和手機湾笛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門饮怯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迄本,你說我怎么就攤上這事硕淑。” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵置媳,是天一觀的道長于樟。 經(jīng)常有香客問我,道長拇囊,這世上最難降的妖魔是什么迂曲? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮寥袭,結(jié)果婚禮上路捧,老公的妹妹穿的比我還像新娘。我一直安慰自己传黄,他們只是感情好杰扫,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膘掰,像睡著了一般章姓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上识埋,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天凡伊,我揣著相機與錄音,去河邊找鬼窒舟。 笑死系忙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惠豺。 我是一名探鬼主播银还,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耕腾!你這毒婦竟也來了见剩?” 一聲冷哼從身側(cè)響起杀糯,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扫俺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后固翰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼纬,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年骂际,在試婚紗的時候發(fā)現(xiàn)自己被綠了疗琉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡歉铝,死狀恐怖盈简,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤柠贤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布香浩,位于F島的核電站,受9級特大地震影響臼勉,放射性物質(zhì)發(fā)生泄漏邻吭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一宴霸、第九天 我趴在偏房一處隱蔽的房頂上張望囱晴。 院中可真熱鬧,春花似錦瓢谢、人聲如沸畸写。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艺糜。三九已至,卻和暖如春幢尚,著一層夾襖步出監(jiān)牢的瞬間破停,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工尉剩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留真慢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓理茎,卻偏偏與公主長得像黑界,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皂林,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容