外观模式是软件工程中经常使用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。
在外观模式的做用下,咱们客户端只依赖外观一个接口,而在原始的方式下,咱们的客户端依赖于整个子系统,因此外观模式主要解决的是类之间的耦合过于复杂。web
相比起观察者模式,适配器模式等适合小规模使用的设计模式,外观模式更多的是大范围的使用,它会是不少时候支撑咱们整个架构的设计思路。设计模式
public abstract class DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenMineWorker.class); 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(); break; case WAKE_UP: wakeUp(); break; case GO_HOME: goHome(); break; case GO_TO_MINE: goToMine(); break; case WORK: work(); break; default: LOGGER.info("Undefined action"); break; } } /** * Perform actions */ public void action(Action... actions) { for (Action action : actions) { action(action); } } public abstract void work(); public abstract String name(); static enum Action { GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK } }
public class DwarvenTunnelDigger extends DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenTunnelDigger.class); @Override public void work() { LOGGER.info("{} creates another promising tunnel.", name()); } @Override public String name() { return "Dwarven tunnel digger"; } }
public class DwarvenGoldDigger extends DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenGoldDigger.class); @Override public void work() { LOGGER.info("{} digs for gold.", name()); } @Override public String name() { return "Dwarf gold digger"; } }
public class DwarvenCartOperator extends DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenCartOperator.class); @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; /** * Constructor */ public DwarvenGoldmineFacade() { workers = new ArrayList<>(); workers.add(new DwarvenGoldDigger()); workers.add(new DwarvenCartOperator()); workers.add(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) { for (DwarvenMineWorker worker : workers) { worker.action(actions); } } }
public class App { public static void main(String[] args) { DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade(); facade.startNewDay(); facade.digOutGold(); facade.endDay(); } }