首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
设计模式之模板模式(转)
时间:
2015-08-20 12:29:29
阅读:
152
评论:
0
收藏:
0
[点我收藏+]
标签:
模板方法模式(Template Method):
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。该模式
使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景:
1、
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。即
“
重分解以一般化
”
,
首先识别现有代码中的
不同之处
,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3、
控制子类扩展。模板方法只在特定点调用
“
Hook Method
(钩子方法)
”
操作,这样就只允许在这些点进行扩展。
通用类图如下:
我们这里的类图会详细一点,如下:
具体代码实现如下:
abstract
class
AbstractMethod {
protected
abstract
void
method1();
protected
abstract
void
method2();
// 模板方法,统一调用上面两个在子类中会被实现的方法,即不同的实现
public
final
void
templateMethod() {
/*
* 此方法体内也可以通过“钩子方法”来实现根据一定情况调用 不同的方法组合
*/
if
(hookMethod()) {
method1();
}
else
{
method1();
method2();
}
}
// 钩子方法,protected权限可被子类覆盖,默认为返回true
protected
boolean
hookMethod() {
return
true
;
}
}
class
ConcreteMethodA
extends
AbstractMethod{
protected
void
method1() {
System.out.println(
"子类 A :method1() ..."
);
}
protected
void
method2() {
System.out.println(
"子类 A :method2() ..."
);
}
}
class
ConcreteMethodB
extends
AbstractMethod{
protected
void
method1() {
System.out.println(
"子类 B :method1() ..."
);
}
protected
void
method2() {
System.out.println(
"子类 B :method2() ..."
);
}
//覆盖钩子方法
protected
boolean
hookMethod() {
return
false
;
}
}
public
class
Client {
public
static
void
main(String[] args) {
AbstractMethod methodA =
new
ConcreteMethodA();
methodA.templateMethod();
AbstractMethod methodB=
new
ConcreteMethodB();
methodB.templateMethod();
}
}
测试结果:
子类 A :method1() ...
子类 B :method1() ...
子类 B :method2() ...
至此,模板方法模式就简单地实现了,我们明白到抽象类
AbstactMethod
中的模板方法实际上是提供了一个外部可访问的接口,外部环境由该接口进入获得服务,而
AbstractMethod
类在此将子类可能提供不同服务给封装隐藏起来,即延迟了某些具体服务的细节,由其子类来负责实现。
另外,钩子方法的合理使用也可以使得模板方法模式更加灵活,不至于被
templateMethod()
简单地限制着,请参看上面例子的代码实现和测试结果。
设计模式之模板模式(转)
标签:
原文地址:http://www.cnblogs.com/WalsonWang/p/4744632.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!