一.概念
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易被使用。
二.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();
}
}
四.使用场景及使用感受
- 开发阶段,子系统往往因为不算得重构演化而变的越来越复杂,这给调用它们的用户程序带来了使用上的困难,增加外观可以提供一个简单的接口,减少它们之间的依赖。
- 在维护一个大型遗留系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含了非常重要的功能,新的需求开发需要依赖于它。你可以为新系统开发一个外观类。
- 设计原则之最少知识原则:只和你的密友谈话。