简介:让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤
目的:
总结:接口规范整体框架结构, 抽象父类规范子类结构
组成:接口,抽象类,子类
1,接口
package com.design.i.template; /** * 接口规范框架结构 */ public interface PageService { /** * HTML创建 * @return */ String createHtml(); }
2,抽象类
package com.design.i.template; /** * 抽象类规范子类框架结构 */ public abstract class AbstractPage implements PageService{ private static final String DOC_TYPE = "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"; private static final String W3_HTML = "<html xmlns="http://www.w3.org/1999/xhtml">"; private static final String END_HTML = "</html>"; private StringBuffer stringBuffer = new StringBuffer(); /** * 定义一个页面的机构 * * 使用final不允许子类进行重写次方法 */ @Override public final String createHtml() { stringBuffer.append(DOC_TYPE); stringBuffer.append(" "); stringBuffer.append(W3_HTML); stringBuffer.append(" "); /** * Head和Body有具体的子类实现 */ appendMeta(stringBuffer); stringBuffer.append(" "); appendHead(stringBuffer); stringBuffer.append(" "); appendBody(stringBuffer); stringBuffer.append(" "); stringBuffer.append(END_HTML); return stringBuffer.toString(); } /** * 开放给子类的方法,子类根据自己需求进行重写 * @param stringBuffer */ protected void appendMeta(StringBuffer stringBuffer){ stringBuffer.append("<meta -------------AbstractPage 默认 Meta 配置--------------- />"); } /** * 子类必须实现的方法 * @param stringBuffer * @return */ protected abstract void appendHead(StringBuffer stringBuffer); protected abstract void appendBody(StringBuffer stringBuffer); }
3,子类
package com.design.i.template; /** * 首页 */ public class IndexPageServiceImpl extends AbstractPage{ @Override protected void appendMeta(StringBuffer stringBuffer) { stringBuffer.append("<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />"); } @Override protected void appendHead(StringBuffer stringBuffer) { stringBuffer.append("<head><title>首页</title></head>"); } @Override protected void appendBody(StringBuffer stringBuffer) { stringBuffer.append("<body><h1>天猫商城双十一交易额突破1200亿 !</h1></body>"); } }
package com.design.i.template; /** * 详情页 */ public class DetailPageServiceImpl extends AbstractPage { @Override protected void appendHead(StringBuffer stringBuffer) { stringBuffer.append("<head><title>详情页</title></head>"); } @Override protected void appendBody(StringBuffer stringBuffer) { stringBuffer.append("<body><h1>联想笔记本电脑 双十一 打折价 1500 元 !</h1></body>"); } }
4,Main
package com.design.i.template; /** * 9-模板模式 * * 组成:一个接口,一个抽象类 * 原理:接口规范整体框架结构, 抽象父类规范子类结构, 抽象父类适当开放部分变化的功能, 子类根据自己需求实现功能 * 接口和抽象类定义框架,子类进行细节实现 * 用处:算法框架 * * JDK类加载器: * 1-启动类加载器 * 加载JAVA_HOME/lib目录下启动类 * 2-扩展类加载器 * 加载JAVA_HOME/lib/ext目录下扩展类 * 3-应用程序类加载器 * 加载用户应用程序的类,例如:com.design.strategy.annotation.PriceFactory.classLoader */ public class MainTest { public static void main(String[] args){ //首页 PageService indexPage = new IndexPageServiceImpl(); System.out.println(indexPage.createHtml()); //详情页 PageService detailPage = new DetailPageServiceImpl(); System.out.println(detailPage.createHtml()); } }
5,Result
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head><title>首页</title></head> <body><h1>天猫商城双十一交易额突破1200亿 !</h1></body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <meta -------------AbstractPage 默认 Meta 配置--------------- /> <head><title>详情页</title></head> <body><h1>联想笔记本电脑 双十一 打折价 1500 元 !</h1></body> </html>