java23种设计模式之模板设计模式

发布于 2021-09-06 00:24

模板设计模式。很重要也很常见的设计模式。

重点,必备的几步操作不变,具体逻辑会有些不一样。

比如:你要使用某些类 就必须要先初始化一些参数。然后处理完之后还需要释放资源或者通知第三方等等操作。

假设有一个活动,需要经过很多步骤才能完成(A-B-C),某些步骤是固定不变的(A\C),而其他步骤经常发生变化(B)。那么,这样的问题要怎么解决呢? 先从回家过年说起:春节是中国最热闹的传统节日,对于在外漂泊多时的游子而言,最幸福的事莫过于回家过年。为了回家团圆,我们首先需要购票,然后乘车,最后才能和家人团聚。这里我们编写了一个简单的程序来模拟这个过程(PeopleTravleByTrain.java类)。它有一个方法celebrateSpringFestival()把购票、坐车、欢度春节的逻辑都写在这个方法里。代码如下:

package com.example.demo.sheji;/** */public class PeopleTravleByTrain{        public void celebrateSpringFestival1() {        //买票        System.out.println("Buying ticket....");        // 坐火车        System.out.println("Travelling by train.....");        //欢度春节        System.out.println("Happy New Year with family.....");    }    public void celebrateSpringFestival2() {        //买票        System.out.println("Buying ticket....");        // 坐汽车        System.out.println("Travelling by coach.....");        //欢度春节        System.out.println("Happy New Year with family.....");    }}

看似很好解决了问题,然后我们却发现这里面有很多重复的代码(买票和团圆)。当回家方式越来越多时,重复的代码就会越来越多。这使维护变得非常困难(当需要修改买票、团圆逻辑时,你得每一个类,每一个类的去修改。还得但心是否都改完全了)。这有背于编程原则DRY(Don't Repeat Yourself)

解决问题:

我们使用继承方式重新实现上面例子,代码如下:

模板类方法

package com.example.demo.sheji;/** */public abstract class HappyPeople {    public void celebrateSpringFestival() {        //买票        buyTicket();        //坐车        travel();        //团圆        celebreate();    }    //买票    protected final void buyTicket() {        System.out.println("Buyingticket .....");    }    //欢度春节    protected final void celebreate() {        System.out.println("HappyNew Year with family .....");    }    //坐车    protected abstract void travel();    }

汽车实现

package com.example.demo.sheji;/** */public class PeopleTravelByCoach extends HappyPeople {    @Override    protected void travel() {        System.out.println("Travellingby coach ......");    }}

火车实现

package com.example.demo.sheji;/** */public class PeopleTravelByTrain extends HappyPeople {    @Override    protected void travel() {        System.out.println("Travelingby train .....");    }}

下面是我们编写测试代码:(Client.java)

package com.example.demo.sheji;/** */public class Client {    public static void main(String[] args) {        HappyPeople tom = new PeopleTravelByTrain();        HappyPeople ross = new PeopleTravelByCoach();        System.out.println("Tom is going home by train:");        tom.celebrateSpringFestival();        System.out.println();        System.out.println("Ross is going home by coach:");        ross.celebrateSpringFestival();    }}






往期推荐

git操作之误add和commit应该如何回滚
百度网盘目录树在线V2.0版功能介绍~
【工具】Mybatis SQL 格式化工具
windows下搭建redis集群
读写锁 ReadWriteLock 适用场景
可重入锁和不可重入锁的区别

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材