AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

代碼變形記之模板方法模式

來(lái)源: 責(zé)編: 時(shí)間:2023-10-27 09:14:52 228觀看
導(dǎo)讀背景有5類數(shù)據(jù)A、B、C、D、E,需要分別進(jìn)行處理。優(yōu)化前通過(guò)ParamBuilder來(lái)分別構(gòu)造各自參數(shù),然后在Runner中分別調(diào)用,分別判斷。package TemplateMethodPattern.before;public class Runner { public static void mai

背景

有5類數(shù)據(jù)A、B、C、D、E,需要分別進(jìn)行處理。aRH28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)化前

通過(guò)ParamBuilder來(lái)分別構(gòu)造各自參數(shù),然后在Runner中分別調(diào)用,分別判斷。aRH28資訊網(wǎng)——每日最新資訊28at.com

package TemplateMethodPattern.before;public class Runner {    public static void main(String[] args) {        Param param = new Param();        ParamBuilder paramBuilder = new ParamBuilder();        // 處理數(shù)據(jù)A        boolean result = paramBuilder.buildA(param);        if (!result) {            return;        }        boolean inserted = doIt(param);        if (!inserted) {            return;        }        // 處理數(shù)據(jù)B        result = paramBuilder.buildB(param);        if (!result) {            return;        }        inserted = doIt(param);        if (!inserted) {            return;        }        // 處理數(shù)據(jù)C        result = paramBuilder.buildC(param);        if (!result) {            return;        }        inserted = doIt(param);        if (!inserted) {            return;        }        // 處理數(shù)據(jù)D        result = paramBuilder.buildD(param);        if (!result) {            return;        }        inserted = doIt(param);        if (!inserted) {            return;        }        // 處理數(shù)據(jù)E        result = paramBuilder.buildE(param);        if (!result) {            return;        }        inserted = doIt(param);        if (!inserted) {            return;        }    }    public static boolean doIt(Param param) {        return param.flag;    }}
package TemplateMethodPattern.before;import lombok.Data;@Datapublic class Param {    public boolean flag;}
package TemplateMethodPattern.before;public class ParamBuilder {    public boolean buildA(Param param) {        return true;    }    public boolean buildB(Param param) {        return false;    }    public boolean buildC(Param param) {        return true;    }    public boolean buildD(Param param) {        return false;    }    public boolean buildE(Param param) {        return true;    }}

存在問(wèn)題

Runner中存在較多重復(fù)代碼。aRH28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)化方法

模板方法模式,Template Method Pattern。將重復(fù)代碼抽象為一個(gè)抽象類,定義多個(gè)子類繼承并實(shí)現(xiàn)各自代碼。aRH28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)化后

AbstractHandler抽象了重復(fù)方法,子類繼承后實(shí)現(xiàn)build()方法。Runner中調(diào)用process()方法來(lái)遍歷子類對(duì)象進(jìn)行處理。aRH28資訊網(wǎng)——每日最新資訊28at.com

package TemplateMethodPattern.after;import TemplateMethodPattern.after.handler.*;import TemplateMethodPattern.before.Param;import java.util.Arrays;import java.util.List;public class Runner {    public static void main(String[] args) {        Param param = new Param();        List<AbstractHandler> handlers = Arrays.asList(                new AHandler(),                new BHandler(),                new CHandler(),                new DHandler(),                new EHandler()        );        for (AbstractHandler handler : handlers) {            if (!handler.process(param, Runner::doIt)) {                return;            }        }    }    public static boolean doIt(Param param) {        return param.flag;    }}
package TemplateMethodPattern.after.handler;import TemplateMethodPattern.before.Param;import java.util.function.Function;public abstract class AbstractHandler {    protected abstract boolean build(Param param);    public boolean process(Param param, Function<Param, Boolean> doIt) {        boolean result = build(param);        if (!result) {            return false;        }        return doIt.apply(param);    }}
package TemplateMethodPattern.after.handler;import TemplateMethodPattern.before.Param;public class AHandler extends AbstractHandler{    @Override    protected boolean build(Param param) {        return true;    }}
package TemplateMethodPattern.after.handler;import TemplateMethodPattern.before.Param;public class BHandler extends AbstractHandler{    @Override    protected boolean build(Param param) {        return false;    }}
package TemplateMethodPattern.after.handler;import TemplateMethodPattern.before.Param;public class CHandler extends AbstractHandler{    @Override    protected boolean build(Param param) {        return true;    }}
package TemplateMethodPattern.after.handler;import TemplateMethodPattern.before.Param;public class DHandler extends AbstractHandler{    @Override    protected boolean build(Param param) {        return false;    }}
package TemplateMethodPattern.after.handler;import TemplateMethodPattern.before.Param;public class EHandler extends AbstractHandler{    @Override    protected boolean build(Param param) {        return true;    }}

個(gè)人感想,因?yàn)槲沂菑腜ython轉(zhuǎn)到Java,在使用設(shè)計(jì)模式解決這個(gè)問(wèn)題后,我也思考了如果使用Python該怎么處理?Python是動(dòng)態(tài)語(yǔ)言,有鴨子類型,對(duì)于重復(fù)代碼通過(guò)定義一個(gè)公共函數(shù),動(dòng)態(tài)綁定類型就能解決,感興趣的同學(xué)可以試試。不同的語(yǔ)言都各自的優(yōu)勢(shì),也有各自的限制。也有各自的解決方法。aRH28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-15317-0.html代碼變形記之模板方法模式

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python字典全解析:從基礎(chǔ)到高級(jí)應(yīng)用

下一篇: Go的元編程:代碼生成與AST操作

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top