您的位置:首页 > 编程语言 > Java开发

java 设计模式之门面模式

2016-06-30 16:13 363 查看

门面模式简介

面模式(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();     //退房
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息