模板模式的定义:
它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现,这样子类才可以不改变算法结构的前提下重新定义改算法的某些特定步骤。
模板模式的核心:
处理的步骤父类中早已定义好,具体的实现延迟到子类中去完成。
模板方法的角色:
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();