一、模式定义
- 外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
- 设计原则
最少知识原则:只和你的密友谈话。 - 相关组件
- Client:使用外观模式的客户。
- Facade:外观,将一个或数个类的复杂操作隐藏,暴露出一个统一的接口易于使用。
- OtherSystem:其他子系统,或者说是其他类。
二、举例说明
- 场景:一个业务包含多个操作,应把这些操作封装成一个外观,便于客户端使用。
- 具体需求:在商店购买英雄时有三步操作,检验英雄是否存在、该英雄是否参与打折、结算此比交易,这三个步骤分别有三个系统负责。请给客户端提供一个简易的操作方法,包含着三个操作。
三、代码实现
- 负责购买英雄的三个系统
public class HeroSystem { public void validateHero(String heroName) { System.out.println("英雄系统:检验《" + heroName + "》这个英雄是否存在!"); } } public class DisCountSystem { public void calculate(String heroName) { System.out.println("打折系统:检验《" + heroName + "》这个英雄是否参与某项活动的打折,并计算当前英雄的出价格!"); } } public class AccountSystem { public void settlement() { System.out.println("账户系统:结算这笔交易!"); } }
- 商店外观类
public class StoreFacade { private AccountSystem accountSystem; private DisCountSystem disCountSystem; private HeroSystem heroSystem; public StoreFacade(AccountSystem accountSystem, DisCountSystem disCountSystem, HeroSystem heroSystem) { this.accountSystem = accountSystem; this.disCountSystem = disCountSystem; this.heroSystem = heroSystem; } /** * 购买英雄 * * @param heroName 英雄名称 */ public void buyHero(String heroName) { heroSystem.validateHero(heroName); disCountSystem.calculate(heroName); accountSystem.settlement(); } }
- 客户端调用
public static void main(String[] args) { AccountSystem accountSystem = new AccountSystem(); DisCountSystem disCountSystem = new DisCountSystem(); HeroSystem heroSystem = new HeroSystem(); StoreFacade storeFacade = new StoreFacade(accountSystem, disCountSystem, heroSystem); System.out.println("使用外观模式购买一个盖伦英雄!"); storeFacade.buyHero("盖伦"); }
执行结果