当前位置:首页 > 科技  > 软件

代码变形记之模板方法模式

来源: 责编: 时间:2023-10-27 09:14:52 172观看
导读背景有5类数据A、B、C、D、E,需要分别进行处理。优化前通过ParamBuilder来分别构造各自参数,然后在Runner中分别调用,分别判断。package TemplateMethodPattern.before;public class Runner { public static void mai

背景

有5类数据A、B、C、D、E,需要分别进行处理。Xnb28资讯网——每日最新资讯28at.com

优化前

通过ParamBuilder来分别构造各自参数,然后在Runner中分别调用,分别判断。Xnb28资讯网——每日最新资讯28at.com

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

存在问题

Runner中存在较多重复代码。Xnb28资讯网——每日最新资讯28at.com

优化方法

模板方法模式,Template Method Pattern。将重复代码抽象为一个抽象类,定义多个子类继承并实现各自代码。Xnb28资讯网——每日最新资讯28at.com

优化后

AbstractHandler抽象了重复方法,子类继承后实现build()方法。Runner中调用process()方法来遍历子类对象进行处理。Xnb28资讯网——每日最新资讯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;    }}

个人感想,因为我是从Python转到Java,在使用设计模式解决这个问题后,我也思考了如果使用Python该怎么处理?Python是动态语言,有鸭子类型,对于重复代码通过定义一个公共函数,动态绑定类型就能解决,感兴趣的同学可以试试。不同的语言都各自的优势,也有各自的限制。也有各自的解决方法。Xnb28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-15317-0.html代码变形记之模板方法模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python字典全解析:从基础到高级应用

下一篇: Go的元编程:代码生成与AST操作

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 线程通讯的三种方法!通俗易懂

    线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 一篇聊聊Go错误封装机制

    一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 2023年,我眼中的字节跳动

    2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 共享单车的故事讲到哪了?

    共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top
Baidu
map