门面模式简介
面模式(facade pattern),又称外观模式,为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,就是把一堆复杂的流程封装成一个接口供给用户更简单的使用,这个设计模式里有三个角色:
1)门面角色( facade ):这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
2)子系统角色(subsystem):实现了子系统的功能。对它而言, façade 角色就和客户角色一样是未知的,它没有任何 façade 角色的信息和链接。
3)客户角色:调用 façade 角色来完成要得到的功能。
具体案例
- 一个普通的小案例:
子系统及门面类
package sjms.mm.simple;
public class Fade {
public void testA(){
A a = new A();
a.test();
}
public void testB(){
B b = new B();
b.test();
}
public void testC(){
C c = new C();
c.test();
}
}
class A{
public void test(){
System.out.println("访问A");
}
}
class B{
public void test(){
System.out.println("访问B");
}
}
class C{
public void test(){
System.out.println("访问C");
}
}
测试
package sjms.mm.simple;
public class Clinet {
public static void main(String args[]){
//传统调用子系统方法
A a= new A();
a.test();
B b = new B();
b.test();
C c = new C();
c.test();
//门面类调用模式
Fade face = new Fade();
face.testA();
face.testB();
face.testC();
}
}
再来个形象的案例吧,我们去旅游定一个旅馆:
子系统有餐厅,打扫卫生,开房,泡温泉等等,一个门面类前台
package sjms.mm.complex;
public class HotelFade {
//类似于前台一个门面对象,这儿如果有多个餐厅可以设计成数组,如果一个餐厅可以提供很多可以开启多线程。
private ServiceFood food;
private ServiceClean clean;
private ServiceRoom room;
//如果只有一个门面类,这儿可以设计成单例模式。
HotelFade(){
food = new ServiceFood();
clean=new ServiceClean();
room = new ServiceRoom();
}
public void servicefood(){
food.service();
}
public void serviceclean(){
clean.service();
}
public void serviceroom(){
room.service();
}
}
class ServiceFood{
public void service(){
System.out.println("吃饭:为你提供饭菜");
}
}
class ServiceClean{
public void service(){
System.out.println("卫生:为你打扫卫生");
}
}
class ServiceRoom{
public void service(){
System.out.println("住宿:为你开房");
}
}
客户端测试:
package sjms.mm.complex;
public class Clinet {
public static void main(String[] args) {
HotelFade hf = new HotelFade();
hf.serviceroom(); //开房
hf.serviceclean(); //打扫房间
hf.servicefood(); //上菜
hf.serviceclean(); //打扫房间 具体没有写
hf.serviceroom(); //退房
}
}