模板方法模式,一般是为了统一子类的算法实现步骤,所使用的一种手段或者说是方式。它在父类中定义一系列算法的步骤,而将具体的实现都推迟到子类。


    1.构建创建网页的接口

    1. package com.md.template;
    2. public interface PageHtmlGz {
    3. String buldHtml();
    4. }

    2.构建一个抽象类去继承这个接口 、因为java是单继承

    package com.md.template;
    
    public abstract class BuildHtml implements PageHtmlGz {
    
        private StringBuffer stringBuffer = new StringBuffer();
    
        @Override
        public String buldHtml() {
            //首先加入doctype,因为都是html页面,所以我们父类不需要推迟给子类实现,直接在父类实现
            stringBuffer.append( "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" );
            //页面下面就是成对的一个HTML标签,我们也在父类加入,不需要给子类实现
            stringBuffer.append( "<html xmlns=\"http://www.w3.org/1999/xhtml\">" );
            //下面就应该是head标签里的内容了,这个我们父类做不了主了,推迟到子类实现,所以我们定义一个抽象方法,让子类必须实现
            appendHead( stringBuffer );
            //下面是body的内容了,我们父类依然无法做主,仍然推迟到子类实现
            appendBody( stringBuffer );
            //html标签的关闭
            stringBuffer.append( "</html>" );
            return stringBuffer.toString();
        }
    
        //第一个模板方法
        protected abstract void appendHead(StringBuffer stringBuffer);
    
        //第二个模板方法
        protected abstract void appendBody(StringBuffer stringBuffer);
    }
    

    3.构建一个实现类去实现这个抽象类

    package com.md.template;
    
    public class BuildHtmlImpl extends BuildHtml {
    
      //可以选择性覆盖
        @Override
        protected void appendHead(StringBuffer stringBuffer) {
            stringBuffer.append( "niceA" );
        }
    
        @Override
        protected void appendBody(StringBuffer stringBuffer) {
            stringBuffer.append( "niceB" );
        }
    
        public static void main(String[] args) {
            BuildHtml pageBuilder = new BuildHtmlImpl();
            System.out.println(pageBuilder.buldHtml());
        }
    }
    

    通常情况下,模板方法模式用于定义构建某个对象的步骤与顺序,或者定义一个算法的骨架。