本文实例讲述了Java设计模式之模板方法模式。分享给大家供大家参考,具体如下:
我们在生活中,很多事情都包含特定的一些步骤。如去银行办理业务,通常步骤的次序是:取号 –> 填单 –> 等待叫号–>办理业务。这几个步骤中,有的是不变的,比如取号,每个人都要取,但有的是要变的,比如都有填单,但是根据不同的业务,填写的单据不同。又比如我们外出吃饭,一般的步骤是:点餐–>等待–>吃饭–>付钱,也能发现同样的规律。这样的事情数不胜数。
项目开发中,也可能遇到这样的情况,多个功能模块,可能有相似或相同的操作步骤,只是其中某一环节或某一个步骤不相同,我们就可以抽取一个或多个公用的父类(模板),让子类实现具体的方法。我们以去银行办理业务为例:
模拟抽象类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/** * 模板方法模式的模板框架(以去银行办理业务为例) * @description: */ public abstract class TempletBankFrame { /* 比如:去柜台办理银行卡业务* */ public final void handleBankCard() { /* 第一步:进入银行大厅取号* */ takeNumber(); /* 第二步:填写办理业务的相关单据* */ if(!isNeedThisMethod()){//特殊情况可以添加判断,如我之前有填写好单子,那今天就不必再填写了 writeBill(); } /* 第三步:等待工作人员叫号* */ waitCall(); /* 第四步:办理业务* */ handleCard(); } /* 取号步骤是不需要更改的,所以我们用private修饰* */ private void takeNumber() { System.out.println("办理银行业务请取号!"); } /* 办理的业务不同,填写的内容不同,所以我们用protected修饰,让子类去处理具体业务* */ protected abstract void writeBill(); /* 等待叫号步骤也是不需要更改的,所以我们用private修饰* */ private void waitCall() { System.out.println("办理银行业务请取号!"); } /* 办理的业务不同,用protected修饰,让子类去处理具体业务* */ protected abstract void handleCard(); /*定义一个钩子方法:由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。**/ protected abstract boolean isNeedThisMethod(); } |
具体实现类:如办理取钱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 办理取钱业务 * @description: */ public class GetMoney extends TempletBankFrame { @Override protected void writeBill() { System.out.println( "我在填写取钱的单据!" ); } @Override protected void handleCard() { System.out.println( "我要取500万大洋" ); } @Override protected boolean isNeedThisMethod() { System.out.println( "我已经填写过单子,今天就直接等待叫号了吧!" ); return true ; } } |
具体实现类:如我是去办银行卡
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 办理银行卡 * @description: */ public class TackCard extends TempletBankFrame { @Override protected void writeBill() { System.out.println( "我填写的是办理银行卡单据" ); } @Override protected void handleCard() { System.out.println( "我在办卡,即将完成!" ); } @Override protected boolean isNeedThisMethod() { return false ; } } |
测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/** * 模板方法模式测试类 * @description: */ public class Test { public static void main(String[] args) { GetMoney money= new GetMoney(); money.handleBankCard(); //调用模板中的办理业务方法 System.out.println( "———–分隔线—————-" ); TackCard card= new TackCard(); card.handleBankCard(); } } |
最后的输出结果:
1
2
3
4
5
6
7
8
9
|
办理银行业务请取号! 我已经填写过单子,今天就直接等待叫号了吧! 办理银行业务请取号! 我要取 500 万大洋 ———–分隔线—————- 办理银行业务请取号! 我填写的是办理银行卡单据 办理银行业务请取号! 我在办卡,即将完成! |
希望本文所述对大家java程序设计有所帮助。
原文链接:http://blog.csdn.net/true100/article/details/50294185