一、需求

image.png

二、基本介绍

image.png

三、代码

抽象方法

  1. //抽象类,表示豆浆
  2. public abstract class SoyaMilk {
  3. //模板方法, make , 模板方法可以做成final , 不让子类去覆盖.
  4. final void make() {
  5. select();
  6. addCondiments();
  7. soak();
  8. beat();
  9. }
  10. //选材料
  11. void select() {
  12. System.out.println("第一步:选择好的新鲜黄豆 ");
  13. }
  14. //添加不同的配料, 抽象方法, 子类具体实现
  15. abstract void addCondiments();
  16. //浸泡
  17. void soak() {
  18. System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");
  19. }
  20. void beat() {
  21. System.out.println("第四步:黄豆和配料放到豆浆机去打碎 ");
  22. }
  23. }

子类实现

  1. public class RedBeanSoyaMilk extends SoyaMilk {
  2. @Override
  3. void addCondiments() {
  4. // TODO Auto-generated method stub
  5. System.out.println(" 加入上好的红豆 ");
  6. }
  7. }
  1. public class PeanutSoyaMilk extends SoyaMilk {
  2. @Override
  3. void addCondiments() {
  4. // TODO Auto-generated method stub
  5. System.out.println(" 加入上好的花生 ");
  6. }
  7. }

客户端

  1. public class Client {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. // 制作红豆豆浆
  5. System.out.println("----制作红豆豆浆----");
  6. SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
  7. redBeanSoyaMilk.make();
  8. // 制作花生豆浆
  9. System.out.println("----制作花生豆浆----");
  10. SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
  11. peanutSoyaMilk.make();
  12. }
  13. }

四、钩子方法

1、介绍

image.png

2、钩子方法代码举例

抽象类 定义钩子方法

  1. //抽象类,表示豆浆
  2. public abstract class SoyaMilk {
  3. //模板方法, make , 模板方法可以做成final , 不让子类去覆盖.
  4. final void make() {
  5. select();
  6. if(customerWantCondiments()) {
  7. addCondiments();
  8. }
  9. soak();
  10. beat();
  11. }
  12. //选材料
  13. void select() {
  14. System.out.println("第一步:选择好的新鲜黄豆 ");
  15. }
  16. //添加不同的配料, 抽象方法, 子类具体实现
  17. abstract void addCondiments();
  18. //浸泡
  19. void soak() {
  20. System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");
  21. }
  22. void beat() {
  23. System.out.println("第四步:黄豆和配料放到豆浆机去打碎 ");
  24. }
  25. //钩子方法,决定是否需要添加配料
  26. boolean customerWantCondiments() {
  27. return true;
  28. }
  29. }

纯豆浆子类

  1. public class PureSoyaMilk extends SoyaMilk{
  2. @Override
  3. void addCondiments() {
  4. // TODO Auto-generated method stub
  5. //空实现
  6. }
  7. @Override
  8. boolean customerWantCondiments() {
  9. // TODO Auto-generated method stub
  10. return false;
  11. }
  12. }

客户端测试

  1. public class Client {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. //制作红豆豆浆
  5. System.out.println("----制作红豆豆浆----");
  6. SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
  7. redBeanSoyaMilk.make();
  8. System.out.println("----制作花生豆浆----");
  9. SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
  10. peanutSoyaMilk.make();
  11. System.out.println("----制作纯豆浆----");
  12. SoyaMilk pureSoyaMilk = new PureSoyaMilk();
  13. pureSoyaMilk.make();
  14. }
  15. }