一.概念
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易被使用。
二.UML
三.实例分析
大四毕业那会,我们寝室的五个哥们,为了缅怀这即将逝去的大学生活,决定出去旅游,就是所谓的毕业旅行。刚开始考虑的是自己搞定一切,后来发现,还是有点难度,于是就报了旅行社。从这个例子里面,我抽象了这样几个类。
- Bus(大巴)。
- Disney(迪士尼)。
- Hotel(酒店)。
- TravelService(旅行社)。
- Client(我们)。
Bus
package com.zzy.facade; /** * 大巴 * @author eason * */ public class Bus { public void takeBus() { System.out.println("乘坐汽车"); } }
Disney
package com.zzy.facade; /** * 迪士尼 * @author eason * */ public class Disney { public void buyTickets() { System.out.println("购买门票"); } }
Hotel
package com.zzy.facade; /** * 酒店 * @author eason * */ public class Hotel { public void live() { System.out.println("住酒店"); } }
TravelService
package com.zzy.facade; /** * 旅行社 * @author eason * */ public class TravelService { private Bus bus; private Disney disney; private Hotel hotel; public TravelService() { this.bus = new Bus(); this.disney = new Disney(); this.hotel = new Hotel(); } public void travel() { bus.takeBus(); disney.buyTickets(); hotel.live(); } }
TestFacade
package com.zzy.facade; /** * 测试类 * @author eason * */ public class TestFacade { public static void main(String[] args) { travelByYouSelf(); travelByService(); } //自己旅行 private static void travelByYouSelf() { Bus bus = new Bus(); Disney disney = new Disney(); Hotel hotel = new Hotel(); bus.takeBus(); disney.buyTickets(); hotel.live(); } //找个旅行社如下 private static void travelByService() { TravelService ts = new TravelService(); ts.travel(); } }
四.使用场景及使用感受
- 开发阶段,子系统往往因为不算得重构演化而变的越来越复杂,这给调用它们的用户程序带来了使用上的困难,增加外观可以提供一个简单的接口,减少它们之间的依赖。
- 在维护一个大型遗留系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含了非常重要的功能,新的需求开发需要依赖于它。你可以为新系统开发一个外观类。
- 设计原则之最少知识原则:只和你的密友谈话。