标签:color abstract method 描述 oid 地方 面向 nal 平台
public abstract class AbstractTemplate { /** * 模板方法 */ public void templateMethod(){ //调用基本方法 abstractMethod(); hookMethod(); concreteMethod(); } /** * 基本方法的声明(由子类实现) */ protected abstract void abstractMethod(); /** * 基本方法(空方法) */ protected void hookMethod(){} /** * 基本方法(已经实现) */ private final void concreteMethod(){ //业务相关的代码 } }
package template; /** * * Title: HouseTemplate Description: 房子抽象类 (模板模式) * * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月12日 */ public abstract class HouseTemplate { protected String name; protected HouseTemplate(String name) { this.name = name; } /* * 基本方法-留给子类实现 */ protected abstract void buildDoor(); /* * 基本方法-留给子类实现 */ protected abstract void buildWindow(); /* * 基本方法-留给子类实现 */ protected abstract void buildWall(); /* * 基本方法-留给子类实现 */ protected abstract void buildBase(); /* * 基本方法-留给子类实现 */ protected abstract void buildToliet(); /* * 钩子方法 */ protected boolean isBuildToliet() { return false; } /* * 模板方法 */ public final void buildHourse() { buildBase(); buildWall(); buildDoor(); buildWindow(); if (isBuildToliet()) { buildToliet(); } } }
其次,构建建造房屋A和B的具体实现类:
package template; /** * * Title: HouseA * Description: 建造A房屋 * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月12日 */ public class HouseA extends HouseTemplate { private boolean isBuildToliet; protected HouseA(String name) { super(name); } protected HouseA(String name, boolean isBuildToliet) { super(name); this.isBuildToliet = isBuildToliet; } @Override protected void buildDoor() { System.out.println(name + " 的门采用防盗门"); } @Override protected void buildWindow() { System.out.println(name + "的窗户要面向北方"); } @Override protected void buildWall() { System.out.println(name + "的墙使用大理石建造"); } @Override protected void buildBase() { System.out.println(name + "的地基使用钢铁地基"); } @Override protected void buildToliet() { System.out.println(name + "的厕所建在东南角"); } @Override protected boolean isBuildToliet() { return isBuildToliet; } }
package template; /** * * Title: HouseB * Description: 建造B房屋 * @author yacong_liu Email:2682505646@qq.com * @date 2019年1月12日 */ public class HouseB extends HouseTemplate { protected HouseB(String name) { super(name); } @Override protected void buildDoor() { System.out.println(name + "的门采用木门"); } @Override protected void buildWindow() { System.out.println(name + "的窗户要向南"); } @Override protected void buildWall() { System.out.println(name + "的墙使用玻璃制造"); } @Override protected void buildBase() { System.out.println(name + "的地基使用花岗岩"); } @Override protected void buildToliet() { System.out.println(name + "的厕所建在西北角"); } }
客户端测试类:
package template; import static org.junit.Assert.*; import org.junit.Test; public class HouseTemplateTest { @Test public void testBuildHourse() { HouseTemplate houseA = new HouseA("HouseA", true); HouseTemplate houseB = new HouseB("HouseB"); houseA.buildHourse(); System.out.println("*************************"); houseB.buildHourse(); } }
输出结果:
HouseA的地基使用钢铁地基HouseA的墙使用大理石建造HouseA 的门采用防盗门HouseA的窗户要面向北方HouseA的厕所建在东南角*************************HouseB的地基使用花岗岩HouseB的墙使用玻璃制造HouseB的门采用木门HouseB的窗户要向南
标签:color abstract method 描述 oid 地方 面向 nal 平台
原文地址:https://www.cnblogs.com/lyc-smile/p/10310425.html