成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
因為我是從Python轉到Java,在使用設計模式解決這個問題后,我也思考了如果使用Python該怎么處理?Python是動態語言,有鴨子類型,對于重復代碼通過定義一個公共函數,動態綁定類型就能解決,感興趣的同學可以試試。不同的語言都各自的優勢,也有各自的限制。也有各自的解決方法。?

背景

有5類數據A、B、C、D、E,需要分別進行處理。

優化前

通過ParamBuilder來分別構造各自參數,然后在Runner中分別調用,分別判斷。

package TemplateMethodPattern.before;

public class Runner {
    public static void main(String[] args) {
        Param param = new Param();
        ParamBuilder paramBuilder = new ParamBuilder();
        // 處理數據A
        boolean result = paramBuilder.buildA(param);
        if (!result) {
            return;
        }
        boolean inserted = doIt(param);
        if (!inserted) {
            return;
        }
        // 處理數據B
        result = paramBuilder.buildB(param);
        if (!result) {
            return;
        }
        inserted = doIt(param);
        if (!inserted) {
            return;
        }
        // 處理數據C
        result = paramBuilder.buildC(param);
        if (!result) {
            return;
        }
        inserted = doIt(param);
        if (!inserted) {
            return;
        }
        // 處理數據D
        result = paramBuilder.buildD(param);
        if (!result) {
            return;
        }
        inserted = doIt(param);
        if (!inserted) {
            return;
        }
        // 處理數據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;

@Data
public 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;
    }
}

存在問題

Runner中存在較多重復代碼。

優化方法

模板方法模式,Template Method Pattern。將重復代碼抽象為一個抽象類,定義多個子類繼承并實現各自代碼。

優化后

AbstractHandler抽象了重復方法,子類繼承后實現build()方法。Runner中調用process()方法來遍歷子類對象進行處理。

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;
    }
}

個人感想,因為我是從Python轉到Java,在使用設計模式解決這個問題后,我也思考了如果使用Python該怎么處理?Python是動態語言,有鴨子類型,對于重復代碼通過定義一個公共函數,動態綁定類型就能解決,感興趣的同學可以試試。不同的語言都各自的優勢,也有各自的限制。也有各自的解決方法。

責任編輯:武曉燕 來源: 測試開發剛哥
相關推薦

2015-11-27 18:32:02

Dex優化分包方案

2017-07-25 09:24:27

前端MVC

2022-10-27 09:04:07

wepyuniapp開發

2023-04-20 07:18:56

CTO驅動力

2012-10-16 16:32:14

2017-11-29 09:34:03

MVP蘇寧移動

2019-05-13 16:08:30

蘋果iMessage垃圾短信

2012-07-11 08:51:51

設計模式

2015-10-13 10:54:15

中關村創業電子賣場

2013-12-17 17:23:06

2015-09-10 13:35:45

云海大數據一體機

2025-03-20 08:34:46

2023-12-12 11:09:55

模板方法模式python設計模式

2013-11-26 17:15:13

Android設計模式

2023-05-15 08:38:58

模板方法模式

2022-07-04 07:37:51

模板模式重構

2021-06-16 08:56:06

模版方法模式設計模式行為型設計模式

2020-09-23 06:52:49

代碼方法模式

2024-02-21 12:24:33

模板設計模式框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产精品视频观看 | 欧美日韩亚洲国产综合 | 激情综合五月 | 夜夜摸天天操 | 日日骚网| 九色av| 激情视频一区 | 国产精品夜夜春夜夜爽久久电影 | 日韩国产一区二区三区 | 精品久久网 | 97精品一区二区 | 日韩午夜精品 | 免费一级淫片aaa片毛片a级 | 国产精品久久久久久久一区探花 | 国产欧美精品一区二区三区 | 欧美国产91 | 成人综合一区 | 亚洲精品久久视频 | 久草资源在线 | 国产欧美一区二区三区国产幕精品 | 一区二区三区视频在线观看 | 一区二区三区视频在线 | 日日草夜夜草 | www.一区二区三区.com | 久久精品—区二区三区 | 日本精品久久久久久久 | 黄色大片毛片 | 成人av影院| 一区二区视频 | 91精品无人区卡一卡二卡三 | 国产欧美精品一区二区三区 | www.蜜桃av| 亚洲欧美日韩在线 | 国产精品一二三区在线观看 | 可以免费观看的av片 | 久久一区二区视频 | 日韩精品一区二区三区在线播放 | 日韩精品久久久久久 | 日本电影一区二区 | 欧美人成在线视频 | 久久久妇女国产精品影视 |