模板方法模式:用来定义一个操作中的算法的骨架,将一些具体步骤延迟到子类中。
//定义一个抽象类
public abstract class abstractclass{
//抽象方法1,实现延迟到子类实现 public abstract void detailoperation1(stringbuffer stringbuffer); //抽象方法2,同上 public abstract void detailoperation2(stringbuffer stringbuffer); //模板方法,给出了逻辑的骨架 public void tempalte(){ stringbuffer stringbuffer = new stringbuffer();
//一些固定的操作可以直接在该类实现 例如该注释下的第一行代码,另外一些细节可能产生变化的操作就把他们的实现放到子类去实现,如detailoperation1() stringbuffer.append("模板代码........"); detailoperation1(stringbuffer); detailoperation2(stringbuffer); stringbuffer.append("模板代码结束......."); system.out.println(stringbuffer); } }
具体的子类a,实现了父类的抽象方法。
public class concreteclassa extends abstractclass { @override public void detailoperation1(stringbuffer stringbuffer) { stringbuffer.append("concreteclassa detailoperation1...."); } @override public void detailoperation2(stringbuffer stringbuffer) { stringbuffer.append("concreteclassa detailoperation2...."); } }
具体的子类b,同样实现了父类的抽象方法,但是实现的具体细节和a不同
public class concreteclassb extends abstractclass { @override public void detailoperation1(stringbuffer stringbuffer) { stringbuffer.append("concreteclassb detailoperation1...."); } @override public void detailoperation2(stringbuffer stringbuffer) { stringbuffer.append("concreteclassb detailoperation2...."); } }
测试方法
public class test { public static void main(string[] args) { abstractclass concreteclassa = new concreteclassa(); concreteclassa.tempalte(); abstractclass concreteclassb = new concreteclassb(); concreteclassb.tempalte(); } }
测试结果:
模板代码........concreteclassa detailoperation1....concreteclassa detailoperation2....模板代码结束.......
模板代码........concreteclassb detailoperation1....concreteclassb detailoperation2....模板代码结束.......
总结:当我们要完成一系列的步骤时,有一部分实现的细节不同,其他的操作都相同时,我们可以考虑使用模板方法模式,把不变的操作提炼到父类,不同的实现细节放到子类,这样就提高了代码的复用性。
如对本文有疑问, 点击进行留言回复!!
[杭电多校2020]第一场 1004 Distinct Sub-palindromes
Swift -- 将本地生成的UIImage进行持久化保存(存到文件中fileManager.createFile)
网友评论