</pre>1 概述:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤<p></p><p>2 模板模式其实非常简单,仅仅使用了Java的继承机制,它的方法分为两类:基本方法和模板方法</p><p> 基本方法: 基本方法是有子类实现的方法,在父类(模板方法中)被调用</p><p> 模板方法:可以是一个或者几个,一般是一个具体方法,是对子类已经实现的基本方法进行调度,一般写在父类中,作为一个框架来使用,(一般模式方法都需要加上final关键字,防止被复写)</p><p>3 模板模式的优缺点:</p><p> 优点:1.封装不变部分,拓展可变部分,例如我们可以把可以拓展的部分放在子类中去实现,把不可变的部分放在父类的模板方法中</p><p> 2.提取公共代码,便于维护,可以把公共的代码抽取到父类的模板方法中,便于修改</p><p> 3.行为由父类控制,子类实现,子类可以通过拓展的方式增加功能,符合开闭原则</p><p>4 使用场景:</p><p> 1.多个子类中有共有的方法,并且逻辑基本相同</p><p> 2.重要,复杂的核心方法定义为模板方法,其他一些需要实现的细节定义为基本方法</p><p> 3.这是一种重构时经常用到的一种设计模式,把一些相同的代码抽取到父类中</p><p>5.示例: </p><p><pre name="code" class="java">public abstract class GameModel {
/**
* 基本方法,
*/
public abstract void openComputer();
public abstract void openGame();
public abstract void login();
public abstract void play();
/**
* 钩子方法,默认不会接到电话
* @return
*/
protected boolean isCall(){
return false;
}
/**
* 模板方法
*/
public final void playGame(){
if(this.isCall()){
Log.e("flag","小王接到了女朋友的电话去陪女朋友去了,只剩小高自己在玩游戏了");
return;
}
this.openComputer();
this.openGame();
this.login();
this.play();
}
}
子类对象:
//小王<pre name="code" class="java">public class XiaoWang extends GameModel{
public boolean isCall = false;
@Override
public void openComputer() {
Log.e("flag","小王打开电脑了");
}
@Override
public void openGame() {
Log.e("flag","小王打开游戏了");
}
@Override
public void login() {
Log.e("flag","小王开始登陆游戏了");
}
@Override
public void play() {
Log.e("flag","小王开始玩耍了");
}
/**
* 小王是否接到了女朋友的电话,不能玩游戏了
* @return
*/
@Override
public boolean isCall() {
return isCall;
}
public void setCall(boolean is){
Log.e("flag","小王接到电话了");
this.isCall = is;
}
}
//小高
public class XiaoGao extends GameModel {
@Override
public void openComputer() {
Log.e("flag","小高打开电脑了");
}
@Override
public void openGame() {
Log.e("flag","小高打开游戏了");
}
@Override
public void login() {
Log.e("flag","小高开始登陆游戏了");
}
@Override
public void play() {
Log.e("flag","小高开始玩耍了");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* java设计模式之模板模式
*/
XiaoWang xiaowang = new XiaoWang();
XiaoGao xiaogao = new XiaoGao();
xiaowang.setCall(true);
xiaowang.playGame();
xiaogao.playGame();
}
github地址:https://github.com/zhouwei5200/MouldDemo