🔍目的
🔍解释
真实世界例子
通俗描述
维基百科
程序示例
使用上面金矿的例子。这里我们有矮人的矿工等级制度。
@Slf4j
public abstract class DwarvenMineWorker {
    public void goToSleep() {
        LOGGER.info("{} goes to sleep.", name());
    }
    public void wakeUp() {
        LOGGER.info("{} wakes up.", name());
    }
    public void goHome() {
        LOGGER.info("{} goes home.", name());
    }
    public void goToMine() {
        LOGGER.info("{} goes to the mine.", name());
    }
    private void action(Action action) {
        switch (action) {
            case GO_TO_SLEEP -> goToSleep();
            case WAKE_UP -> wakeUp();
            case GO_HOME -> goHome();
            case GO_TO_MINE -> goToMine();
            case WORK -> work();
            default -> LOGGER.info("Undefined action");
        }
    }
    public void action(Action... actions) {
        Arrays.stream(actions).forEach(this::action);
    }
    public abstract void work();
    public abstract String name();
    enum Action {
        GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK
    }
}
@Slf4j
public class DwarvenTunnelDigger extends DwarvenMineWorker {
    @Override
    public void work() {
        LOGGER.info("{} creates another promising tunnel.", name());
    }
    @Override
    public String name() {
        return "Dwarven tunnel digger";
    }
}
@Slf4j
public class DwarvenGoldDigger extends DwarvenMineWorker {
    @Override
    public void work() {
        LOGGER.info("{} digs for gold.", name());
    }
    @Override
    public String name() {
        return "Dwarf gold digger";
    }
}
@Slf4j
public class DwarvenCartOperator extends DwarvenMineWorker {
    @Override
    public void work() {
        LOGGER.info("{} moves gold chunks out of the mine.", name());
    }
    @Override
    public String name() {
        return "Dwarf cart operator";
    }
}
创建外观类来进行操纵这些矿工:
public class DwarvenGoldmineFacade {
  private final List<DwarvenMineWorker> workers;
  public DwarvenGoldmineFacade() {
      workers = List.of(
            new DwarvenGoldDigger(),
            new DwarvenCartOperator(),
            new DwarvenTunnelDigger());
  }
  public void startNewDay() {
    makeActions(workers, DwarvenMineWorker.Action.WAKE_UP, DwarvenMineWorker.Action.GO_TO_MINE);
  }
  public void digOutGold() {
    makeActions(workers, DwarvenMineWorker.Action.WORK);
  }
  public void endDay() {
    makeActions(workers, DwarvenMineWorker.Action.GO_HOME, DwarvenMineWorker.Action.GO_TO_SLEEP);
  }
  private static void makeActions(Collection<DwarvenMineWorker> workers,
      DwarvenMineWorker.Action... actions) {
    workers.forEach(worker -> worker.action(actions));
  }
}
使用外观:
DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade();
facade.startNewDay();
// Dwarf gold digger wakes up.
// Dwarf gold digger goes to the mine.
// Dwarf cart operator wakes up.
// Dwarf cart operator goes to the mine.
// Dwarven tunnel digger wakes up.
// Dwarven tunnel digger goes to the mine.
facade.digOutGold();
// Dwarf gold digger digs for gold.
// Dwarf cart operator moves gold chunks out of the mine.
// Dwarven tunnel digger creates another promising tunnel.
facade.endDay();
// Dwarf gold digger goes home.
// Dwarf gold digger goes to sleep.
// Dwarf cart operator goes home.
// Dwarf cart operator goes to sleep.
// Dwarven tunnel digger goes home.
// Dwarven tunnel digger goes to sleep.
🔍类图

🔍适用性
使用外观模式
🔍Ending
希望本文能够帮助读者更深入地理解外观模式,并在实际项目中发挥其优势。谢谢阅读!
希望这份博客草稿能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我。











