java设计模式之模板模式

</pre><strong></strong><pre name="code" class="java">

一 概述:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 模板模式其实非常简单,仅仅使用了Java的继承机制
二 它的方法分为两类:基本方法和模板方法 
   基本方法:  基本方法是有子类实现的方法,在父类(模板方法中)被调用 
   模板方法:可以是一个或者几个,一般是一个具体方法,是对子类已经实现的基本方法进行调度,一般写在父类中,作为一个框架来使用,(一般模式方法都需要加上final                                关键字,防止被复写) 


三 模板模式的优缺点: 优点:1.封装不变部分,拓展可变部分,例如我们可以把可以拓展的部分放在子类中去实现,把不可变的部分放在父类的模板方法中</p><p>                                 2.提取公共代码,便于维护,可以把公共的代码抽取到父类的模板方法中,便于修改               
        3.行为由父类控制,子类    实现,子类可以通过拓展的方式增.加功能,符合开闭原
四 使用场景:     1.多个子类中有共有的方法,并且逻辑基本相同     
              2.重要,复杂的核心方法定义为模板方法,其他一些需要实现的细节定义为基本方法      
                              3.这是一种重构时经常用到的一种设计模式,把一些相同的代码抽取到父类中</p><p>
五.示例:  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><pre name="code" class="java">子类对象:
    //小王<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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值