1.引入
模板方法模式就是当我们需要把某些细节层次,但器个别步骤的更详细的实现却是不同的时候,就需要用模板方法模式。实际上就是把一些更详细的信息在子类中去实现,这里更详细的信息就是可变的信息,因为每个子类都不同,所以具有可变信息,然后把不变的行为给他封装到父类中去,这样就去除子类中重复的代码了。
2.举例
一般我们做系统时都是照着软件工程的思想,就是先做需求分析,然后概要设计,然后详细设计,然后编码,测试,发布这几个步骤,虽然每个系统都不一样,但是我们的工作流程是不变的,只是步骤中某个细节可能会是不同的,如需求分析,不同的系统功能,需求分析肯定是不同的。在工作流程上是不变,而其细节上更详细的设计是可变的,我们就采用模板方法模式。对于不同的系统都采用这个工作流程这套模板来设计。
3.实现
--3.1设计流程模板类:
//就是从需求分析到发布系统的一套设计流程
public abstract class DesignCycle {
public abstract void needAnalysis();
public abstract void conceptualDesign();
public abstract void detailedDesign();
public abstract void coding();
public abstract void testSystem();
public abstract void publishSystem();
public void templateDesignSystem(){
System.out.println("------------开始开发----------");
needAnalysis();
conceptualDesign();
detailedDesign();
coding();
testSystem();
publishSystem();
System.out.println("------------开发完毕-----------");
}
}
--3.2.支付系统的实现类:
public class PaymentSystem extends DesignCycle{
@Override
public void needAnalysis() {
// TODO Auto-generated method stub
System.out.println("支付系统的需求分析");
}
@Override
public void conceptualDesign() {
// TODO Auto-generated method stub
System.out.println("支付系统的概要设计");
}
@Override
public void detailedDesign() {
// TODO Auto-generated method stub
System.out.println("支付系统的详细设计");
}
@Override
public void coding() {
// TODO Auto-generated method stub
System.out.println("支付系统的编码");
}
@Override
public void testSystem() {
// TODO Auto-generated method stub
System.out.println("支付系统的测试");
}
@Override
public void publishSystem() {
// TODO Auto-generated method stub
System.out.println("支付系统的发布");
}
}
--3.3.物流系统的实现类:
//物流系统类
public class LogisticSystem extends DesignCycle{
@Override
public void needAnalysis() {
// TODO Auto-generated method stub
System.out.println("物流系统的需求分析");
}
@Override
public void conceptualDesign() {
// TODO Auto-generated method stub
System.out.println("物流系统的概要设计");
}
@Override
public void detailedDesign() {
// TODO Auto-generated method stub
System.out.println("物流系统的详细设计");
}
@Override
public void coding() {
// TODO Auto-generated method stub
System.out.println("物流系统的编码");
}
@Override
public void testSystem() {
// TODO Auto-generated method stub
System.out.println("物流系统的测试");
}
@Override
public void publishSystem() {
// TODO Auto-generated method stub
System.out.println("物流系统的发布");
}
}
--3.4测试类:
public class Test {
public static void main(String[] args) {
DesignCycle dc;
dc=new PaymentSystem();
dc.templateDesignSystem();
dc=new LogisticSystem();
dc.templateDesignSystem();
}
}
结果:
------------开始开发----------
支付系统的需求分析
支付系统的概要设计
支付系统的详细设计
支付系统的编码
支付系统的测试
支付系统的发布
------------开发完毕-----------
------------开始开发----------
物流系统的需求分析
物流系统的概要设计
物流系统的详细设计
物流系统的编码
物流系统的测试
物流系统的发布
------------开发完毕-----------
---------------------------------------------------------------------------------------------------------------------------------------
总结1:
模板方法模式应用场景:当系统中存在不变的行为在子类中重复出现时,就将不变的行为和可变的行为分离,将不变的行为抽取出来放到一个单一的地方,让子类们去实现这个单一的地方。避免了大量的重复代码,也同时为子类的设计做了一个统一的规范。
总结2:
具体的做法就是将重复不变的部分放在抽象父类中,然后让子类们去继承父类,然后重写父类的抽象方法。
总结3:
模板方法模式的使用提高了代码的复用性。