模板方法模式(Template Method Pattern):定义一个操做中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。算法
从模型图来看,模板方法模式很简单,可是很经常使用。抽象模板(AbstractClass)中的方法基本分两类:设计模式
而具体模板(ConcreteClass)主要是实现父类定义的抽象的基本方法。微信
例子:给两种手机作测试的,测试包括“开机,检查,关机”三种操做。下面用具体的代码来讲明:ide
1.抽象类测试
public abstract class TestModel { //开机 protected abstract void open(); //检查 protected abstract void check(); //关闭 protected abstract void close(); //模板方法-测试 public void test(){ this.open();; this.check(); this.close(); } }
2.两个实现类Phone1,Phone2this
public class Phone1 extends TestModel { @Override protected void open() { System.out.println("phone1的开机逻辑"); } @Override protected void check() { System.out.println("phone1的检查逻辑"); } @Override protected void close() { System.out.println("phone1的关机逻辑"); } } public class Phone2 extends TestModel { @Override protected void open() { System.out.println("phone2的开机逻辑"); } @Override protected void check() { System.out.println("phone2的检查逻辑"); } @Override protected void close() { System.out.println("phone2的关机逻辑"); } }
3.调用spa
TestModel testModel1=new Phone1(); TestModel testModel2=new Phone2(); testModel1.test(); testModel2.test();
运行的结果以下:设计
二.扩展code
若是phone1在测试中须要关机,而phone2不须要关机,这时须要一个钩子方法。rem
1.抽象类
public abstract class TestModel { //开机 protected abstract void open(); //检查 protected abstract void check(); //关闭 protected abstract void close(); //模板方法-测试 public void test(){ this.open();; this.check(); if (isClose()){ this.close(); } } //钩子方法,默认是关机 protected boolean isClose(){ return true; } }
2.实现类
public class Phone1 extends TestModel { public boolean isClose=true; public void setIsClose(boolean isClose){ this.isClose=isClose; } protected boolean isClose(){ return this.isClose; } @Override protected void open() { System.out.println("phone1的开机逻辑"); } @Override protected void check() { System.out.println("phone1的检查逻辑"); } @Override protected void close() { System.out.println("phone1的关机逻辑"); } } public class Phone2 extends TestModel { @Override protected void open() { System.out.println("phone2的开机逻辑"); } @Override protected void check() { System.out.println("phone2的检查逻辑"); } @Override protected void close() { System.out.println("phone2的关机逻辑"); } //由于是取消关机,因此直接返回false就能够了 protected boolean isClose(){ return false; } }
3.调用
Phone1 testModel1=new Phone1(); Phone2 testModel2=new Phone2(); //phone1 testModel1.setIsClose(true); testModel1.test(); //phone2 testModel2.test()
1.优势
2.缺点
3.应用
参考资料《大话设计模式》《设计模式之禅》
欢迎你们关注个人微信公众号:安卓干货铺