/** * 制作饮料的抽象类 */ abstract class AbstractMakeDrinkHandler { final void makeDrinkStart() { //1.把水煮沸 boilWater(); //2.独特的浸泡方法 soakMaterial(); //3.倒入茶杯 pourTeacup(); //4.加入调味品 addSeasoning(); } /** * 烧开水方法 */ void boilWater() { System.out.println("开始烧水"); } /** * 抽象的冲泡方法,由子类实现细节 */ protected abstract void soakMaterial(); /** * 倒入茶杯的方法 */ void pourTeacup() { System.out.println("将饮料倒入杯子中"); } /** * 加入调味品的方法,由子类实现细节 */ protected abstract void addSeasoning(); }
/** * 制作咖啡类 */ public class MarkCoffeeHandler extends AbstractMakeDrinkHandler { @Override protected void soakMaterial() { System.out.println("用沸水冲泡咖啡,然后用勺子采用360度缓慢旋转2分钟"); } @Override protected void addSeasoning() { System.out.println("咖啡里加点糖和牛奶"); } }
/** * 制作绿茶类 */ public class MarkTeaHandler extends AbstractMakeDrinkHandler { @Override protected void soakMaterial() { System.out.println("用沸水浸泡茶叶,等茶叶慢慢落下,浸泡2分钟"); } @Override protected void addSeasoning() { System.out.println("茶里加点蜂蜜"); } }
public class MainClass { public static void main(String[] args) { //制作咖啡 MarkCoffeeHandler coffeeHandler = new MarkCoffeeHandler(); coffeeHandler.makeDrinkStart(); System.out.println("======================="); //制作绿茶 MarkTeaHandler teaHandler = new MarkTeaHandler(); teaHandler.makeDrinkStart(); } }
开始烧水 用沸水冲泡咖啡,然后用勺子采用360度缓慢旋转2分钟 将饮料倒入杯子中 咖啡里加点糖和牛奶 ======================= 开始烧水 用沸水浸泡茶叶,等茶叶慢慢落下,浸泡2分钟 将饮料倒入杯子中 茶里加点蜂蜜
/** * 制作饮料的抽象类 */ abstract class AbstractMakeDrinkHandler { final void makeDrinkStart() { //1.把水煮沸 boilWater(); //2.用沸水浸泡茶/冲泡咖啡 soakMaterial(); //3.倒入茶杯 pourTeacup(); //4.加入调料 addSeasoning(); } /** * 烧开水方法 */ void boilWater() { System.out.println("开始烧水"); } /** * 抽象的冲泡方法,由子类实现细节 */ protected abstract void soakMaterial(); /** * 倒入茶杯的方法 */ void pourTeacup() { if (hotDrink()) { System.out.println("热饮料需要准备玻璃杯"); } else { System.out.println("准备纸杯"); } System.out.println("将" + getDrinkName() + "倒入杯子中"); } /** * 加入调味品的方法,由子类实现细节 */ protected abstract void addSeasoning(); /** * 钩子方法,返回饮料的类别 * @return */ public String getDrinkName() { return "饮料"; } /** * 钩子方法,返回是冷饮还是热饮 * @return */ public boolean hotDrink() { return false; } }
/** * 制作咖啡类 */ public class MarkCoffeeHandler extends AbstractMakeDrinkHandler { private String drinkName; private boolean hotDrink; public MarkCoffeeHandler(boolean hotDrink) { this.hotDrink = hotDrink; this.drinkName = "咖啡"; } @Override protected void soakMaterial() { System.out.println("用沸水冲泡咖啡,然后用勺子采用360度缓慢旋转2分钟"); } @Override protected void addSeasoning() { System.out.println("咖啡里加点糖和牛奶"); } @Override public boolean hotDrink() { return this.hotDrink; } @Override public String getDrinkName() { return this.drinkName; } }
/** * 制作绿茶类 */ public class MarkTeaHandler extends AbstractMakeDrinkHandler { private String drinkName; private boolean hotDrink; public MarkTeaHandler(boolean hotDrink) { this.hotDrink = hotDrink; this.drinkName = "绿茶"; } @Override protected void soakMaterial() { System.out.println("用沸水浸泡茶叶,等茶叶慢慢落下,浸泡2分钟"); } @Override protected void addSeasoning() { System.out.println("茶里加点蜂蜜"); } @Override public String getDrinkName() { return this.drinkName; } @Override public boolean hotDrink() { return this.hotDrink; } }
public class MainClass { public static void main(String[] args) { //制作咖啡 MarkCoffeeHandler coffeeHandler = new MarkCoffeeHandler(true); coffeeHandler.makeDrinkStart(); System.out.println("======================="); //制作绿茶 MarkTeaHandler teaHandler = new MarkTeaHandler(false); teaHandler.makeDrinkStart(); } }
开始烧水 用沸水冲泡咖啡,然后用勺子采用360度缓慢旋转2分钟 热饮料需要准备玻璃杯 将咖啡倒入杯子中 咖啡里加点糖和牛奶 ======================= 开始烧水 用沸水浸泡茶叶,等茶叶慢慢落下,浸泡2分钟 准备纸杯 将绿茶倒入杯子中 茶里加点蜂蜜
/** * {@inheritDoc} * * @throws IndexOutOfBoundsException {@inheritDoc} */ abstract public E get(int index);
add 方法,addAll 方法 是钩子方法,由子类决定要不要实现,比如ArrayList ,LinkedList 都有具体的实现
public boolean add(E e) { add(size(), e); return true; } public boolean addAll(int index, Collection<? extends E> c) { rangeCheckForAdd(index); boolean modified = false; for (E e : c) { add(index++, e); modified = true; } return modified; }