JAVA模板方法设计模式——Java设计模式,写漂亮的代码——
Java设计模式,写漂亮的代码
————模板方法设计模式
简介:
模板方法设计模式是Java设计模式中很简单、应用非常广泛的的一种设计模式,该模式体现了编程的抽象思想(抽象是所有子类的共性封装),
仅仅使用了Java的继承机制。其实很可能在你写代码的过程中已经使用过了很多次这种模式,只是你还不太清楚那就是模板方法设计模式。
接下来就让我们一起去看看,到底什么是模板方法设计模式呢?
首先看一下描述:
定义一个操作中的算法的框架,而将一些步骤延迟到了子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
UML类图描述:
下图就是模板方法设计模式的UML类图描述,正如你所见,没错,就是这么简单,一目就能了然。
其中AbstractClass叫做抽象模板类,实现了模板方法,定义了算法的骨架,它的方法分为两类:
- 基本方法:基本方法也叫作基本操作,是由子类实现的方法,并且在模板方法被调用.
- 模板方法:可以有一个或者几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
具体类:ConcreteClass:实现抽象类中的抽象方法,完成完整的算法。
下面通过一个简单的例子描述下模板方法模式的应用:
本例子通过模拟手机情景模式的过程,简单描述下模板方法的应用:
public abstract class SceneMode {
//这里定义了一个抽象类,即模板方法模式的抽象模板类,把子类共有的一些操作抽象到该类中,情景模式普遍就是响铃和震动的操作,这里将通用的流程放到该类中,具体的配置通过其子类来完成
private static final String TAG = "SceneMode";
private static final String DEFAULT_RING = "little Star";
private String mRing = DEFAULT_RING;
private boolean isRing;
private boolean isVibrating;
public void goModel() {
Log.d(TAG, "开启模式:");
}
//共性方法的抽象,由子类去实现具体的情景模式名称
public abstract String getSceneModelName();
public abstract boolean isRing();
public abstract boolean isVibration();
//钩子函数,外界条件改变,影响了模板函数的执行
public void setRingMusic(String ringName) {
this.mRing = ringName;
};
private void playRing() {
this.isRing = true;
Log.d(TAG, "play: " + mRing);
}
private void vibrating() {
this.isVibrating = true;
Log.d(TAG, "vibrating");
}
private void startRing() {
if (isRing()) playRing();
}
private void startVibrating() {
if (isVibration()) vibrating();
}
private void stopRing() {
if (isRing) {
Log.d(TAG, "停止响铃");
this.isRing = false;
}
}
private void stopVibration() {
if (isVibrating) {
Log.d(TAG, "停止震动");
this.isVibrating = false;
}
}
public final void called() {
//为了防止恶意的操作,一般模板方法都加上final关键字,不允许被重写
Log.d(TAG, "called: 被呼叫");
new Thread() {
@Override
public void run() {
startRing();
startVibrating();
try {
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
stopRing();
stopVibration();
}
}.start();
}
}
public class RingSceneMode extends SceneMode{
//子类响铃模式,完成对应的配置,达到重定义父类called的动作
@Override
public String getSceneModelName() {
return "响铃模式";
}
@Override
public boolean isRing() {
return true;
}
@Override
public boolean isVibration() {
return false;
}
}
public class VibrationSceneMode extends SceneMode{
//子类震动模式,完成对应的配置,达到重定义父类called的动作
@Override
public String getSceneModelName() {
return "振动模式";
}
@Override
public boolean isRing() {
return false;
}
@Override
public boolean isVibration() {
return true;
}
}
如下为场景类,创建不同的模式来完成对应的模式匹配,实现特定模式达到的效果
//1.设置RingMode
mSceneMode = new RingSceneMode();
mSceneMode.setRingMusic("lemon tree");
Log.d(TAG, mSceneMode.getSceneModelName());
mSceneMode.called();
//2.设置VibrationMode
mSceneMode = new VibrationSceneMode();
Log.d(TAG, mSceneMode.getSceneModelName());
mSceneMode.called();
//3.设置Ring + Vibration Mode
mSceneMode = new RingAndVibrationSceneMode();
mSceneMode.setRingMusic("lemon tree");
Log.d(TAG, mSceneMode.getSceneModelName());
mSceneMode.called();
模板方法模式的优点:
- 封装不变部分,扩展可变部分;
- 提取公共部分代码,便于维护;
- 行为由父类控制,子类实现。
模板方法模式的使用场景
- 多个子类有公有的方法,并且逻辑基本相同时。
- 重要复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则有各个子类实现。
- 重构时, 模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(外界条件改变,影响到模板方法的执行)约束其行为。
参考Github地址:https://github.com/tomato0/TempalatePatterns/tree/master
CSDN:http://blog.csdn.net/wsq_tomato/article/details/79518729
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Eclipse的Java build path,可以将一个项目依赖于另外一个项目
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/79523320 我一直想要解决一个问题,就是找到一个模块化的方法,把两个项目中公用的代码抽离,比如说数据库表对应文件的DAO、entity,以及对应的service,但没有找到我想要的那种方案——我也不知道该怎么描述我想要的这种方案,总之就像插件一样吧! 但Eclipse中有一种下策,就是利用Java build path将另外一个项目加入到依赖项目当中。 引入被依赖项目ymeng后,假如说ymeng项目中有一个公共类/ymeng/src/main/java/com/cmower/common/util/DateUtil.java,那么就可以在新的项目中直接使用。 不知道有没有更合理的办法,因为对于ymeng项目来说,我只需要其部分代码,而不是全部代码。 Life is not always what we want it to be. We fight, we cry, and sometimes we give up. But there is ...
-
下一篇
深度剖析:PHP中json_encode与json_decode
一、json_encode() 对变量进行JSON编码, 语法:json_encode($value[,$options=0]) 注意:1、$value为要编码的值,且该函数只对UTF8编码的数据有效; 2、options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS,JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT; 3、第二个参数一般不需要; 4、json数据其实就是一个string,可以用var_dump()打印出来看数据类型; 5、执行成功返回JSON数据,否则返回FALSE。 示例: $book = array('a'=>'xiyouji','b'=>'sanguo','c'=>'shuihu','d'=>'hongloumeng'); $json = json_encode($book); echo $json; 浏览器打印出的结果如下: {"a"...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7,8上快速安装Gitea,搭建Git服务器

微信收款码
支付宝收款码