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 {
protected void travel() {
System.out.println("Travellingby coach ......");
}
}
火车实现
package com.example.demo.sheji;
/**
*/
public class PeopleTravelByTrain extends HappyPeople {
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();
}
}
往期推荐
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材