设计模式之模板方法模式

设计模式之模板方法模式

模板方法模式:
  将子类中重复出现的相同逻辑代码提取出来作为公共部分(一般将其提取放在一个具体的方法中),然后将其中的逻辑组成步骤,推迟至子类中实现(通常将逻辑组成步骤定义为抽象方法)。
  
模式中的角色:
  1)抽象类(AbstractClass):定义了模板方法,此方法中包含了关于功能实现的主要逻辑框架(但逻辑仍不完整,缺少关键的步骤)
  2)实现类(ConcreteClass):实现了抽象类中的抽象方法,填补逻辑框架中的关键步骤。


代码大致介绍
  1)AbstractTemplateMethod.class   定义抽象类,包含公共模板方法;
  2)ImplTemplateMethod_01.class   定义实现类之一
  3)ImplTemplateMethod_02.class   定义实现类之二
  4)TemplateMethodTest       测试类


下面上代码:

package designpattern.templatemethod;

/**
 * @function 抽象模板方法类,通常是将子类中<b style="color:red;">重复</b>出现逻辑代码提取出来
 *            作为<b style="color:red;">公共部分</b>(一般将其放在一个具体的方法中),然后其中的逻辑组成步骤,
 *            推迟至子类中实现(通常将逻辑组成步骤定义为抽象方法)。
 * @author Mr.leaf
 * @time 2017-3-1 17:40:54
 * */
public abstract class AbstractTemplateMethod {
    /**
     * @function 模板方法,给出了逻辑骨架,而逻辑的组成是一系列的抽象操作,均被推迟至子类中实现
     * @describe 若用户abstMethod1()大于等于10,则打印abstMethod2(),否则打印abstMethod3()
     * */
    public void templateMethod(){
        if(abstMethod1() >= 10){
            System.out.println(abstMethod2());
        }else{
            System.out.println(abstMethod3());
        }
    }

    /**
     * @function 抽象方法一,推迟至子类实现,返回一个数字
     * */
    public abstract int abstMethod1();

    /**
     * @function 抽象方法二,推迟至子类实现,返回一个字符串
     * */
    public abstract String abstMethod2();

    /**
     * @function 抽象方法三,推迟至子类实现,返回一个字符串
     * */
    public abstract String abstMethod3();
}
package designpattern.templatemethod;

public class ImplTemplateMethod_01 extends AbstractTemplateMethod {
    private int num = 0;
    private String s1 = "";
    private String s2 = "";

    public ImplTemplateMethod_01() {
        super();
    }

    public ImplTemplateMethod_01(int num, String s1, String s2) {
        super();
        this.num = num;
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public int abstMethod1() {
        // TODO Auto-generated method stub
        return this.num;
    }

    @Override
    public String abstMethod2() {
        // TODO Auto-generated method stub
        return this.s1;
    }

    @Override
    public String abstMethod3() {
        // TODO Auto-generated method stub
        return this.s2;
    }   
}
package designpattern.templatemethod;

public class ImplTemplateMethod_02 extends AbstractTemplateMethod {
    private int num = 0;
    private String s1 = "";
    private String s2 = "";

    public ImplTemplateMethod_02() {
        super();
    }

    public ImplTemplateMethod_02(int num, String s1, String s2) {
        super();
        this.num = num;
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public int abstMethod1() {
        // TODO Auto-generated method stub
        return this.num;
    }

    @Override
    public String abstMethod2() {
        // TODO Auto-generated method stub
        return this.s1;
    }

    @Override
    public String abstMethod3() {
        // TODO Auto-generated method stub
        return this.s2;
    }

}
package designpattern.templatemethod;

import org.junit.Test;

public class TemplateMethodTest {

    @Test
    public void test() {
        //声明并实例化,将子类的声明改为父类,利用多态性,提高代码的复用性
        AbstractTemplateMethod temp1 = new ImplTemplateMethod_01(15, "No.1:大于等于10", "No.1:小于10");
        AbstractTemplateMethod temp2 = new ImplTemplateMethod_01(9, "No.2:大于等于10", "No.2:小于10");

        //调用实现方法
        temp1.templateMethod();
        System.out.println("*********************");
        temp2.templateMethod();
    }
}

代码大致就是这样,很简单,但设计模式的学习绝不仅仅是在代码,而是对设计模式的思考和理解。生活中也有用到这种设计模式的栗子,例如学校即将开学,学校会给各种教职人员安排不同的准备工作来迎接开学,这个时候想象一下,如果单独安排肯定会造成很多重复,所以我们可以先将公共的模板提炼出来,让不同的人员根据需要去使用。(好像学校开请假条也是这种设计模式,有请假条的模板,不同的学生根据不同需要去填写,哈哈^_^)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值