/**
* 制作饮料的抽象类
*/
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;
}
原文:https://www.cnblogs.com/summerDawn/p/15142401.html