Java 模板模式

模板模式定义了一种算法的骨架,并将部分步骤延迟到子类中,允许子类不改变算法结构即可重定义特定步骤。核心在于父类定义步骤,子类实现细节。优点包括封装不变部分、提取公共代码,但可能导致类数量增加。常见应用场景如餐饮下单流程,不同店铺只需实现食物部分。
摘要由CSDN通过智能技术生成

模板模式的定义:

       它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现,这样子类才可以不改变算法结构的前提下重新定义改算法的某些特定步骤。

模板模式的核心:

       处理的步骤父类中早已定义好,具体的实现延迟到子类中去完成。

模板方法的角色:

       1.抽象模板角色:它一般是一个抽象类或者接口,它抽象出操作算法骨架。

       2.具体抽象模板角色:它实现了抽象模板角色的方法,它是操作算法骨架业务的具体化。

模板方法的优点:

        1.封装不变部分,扩展可变部分。

         2.提取了公共代码,便于维护。

          3.行为由父类控制,子类实现。

模板方法的缺点:

         1.每一个不同的实现都需要一个子类来实现,这样导致类的个数增加。

模板模式的使用场景:      

          1.实现一个算法时,基本步骤很固定,但是某些部分易变,易变的部分可以抽离出来,由子类实现。

 

平常我们在面馆是下单,吃面,付钱,在烧烤店,下单,吃烧烤,付钱。在面馆和烧烤店,我们就吃的食物不一样,所以我们下面可以用这个来演示我们的模板模式。

/**
 * 抽象模板角色
 * @author Administrator
 */

public abstract class Template {
    public void oreder(){
        Log.d("templateTest","先下订单");
    }

    abstract void eatFood();

    public void payMoney(){
        Log.d("templateTest","吃完付钱");
    }

    //模板方法,final修饰的方法,不可以被子类重写
    public final  void process(){
        this.oreder();
        this.eatFood();
        this.payMoney();
    }
}

 

/**
 * 具体模板角色(面馆)
 * @author Administrator
 */

public class NoodleShop extends Template{
    @Override
    void eatFood() {
        Log.d("templateTest","我在面馆吃面");
    }
}

 

/**
 * 具体模板角色(烧烤店)
 * @author Administrator
 */
public class BarbecueShop extends Template {
    @Override
    void eatFood() {
        Log.d("templateTest","我在烧烤店吃烧烤");
    }
}

客户端调用:

//在面馆吃面
Template eatNoodle=new NoodleShop();
eatNoodle.process();

结果:

 

//在烧烤店吃烧烤
Template eatBarbecue=new BarbecueShop();
eatBarbecue.process();

结果:

其实上面的调用,还可以用匿名内部类的方式来调用,能起到一样的效果。

Template eatNoodle= new Template() {
     @Override
     void eatFood() {
          Log.d("templateTest","我在面馆吃面");
     }
};
eatNoodle.process();

Template eatBarbecue= new Template() {
     @Override
     void eatFood() {
          Log.d("templateTest","我在烧烤店吃烧烤");
     }
};
eatBarbecue.process();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值