一.门面模式
外部与一个子系统的通信必须通过一个统一的门面对象进行
二.门面模式涉及到的角色:
门面角色:客户端可以调用这个角色的方法,此角色知晓相关的一个或多个子系统的功能和责任,通常情况下,此角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统角色:可以同时拥有一个或多个子系统,每一个子系统可以不是一个单独的类,而是一个类的集合,每一个子系统都可以直接被客户端调用或者被门面角色调用,子系统并不知道门面角色的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
三.举例:
我有一个专业数码相机,在给MM拍照时我就喜欢手动调节ISO速度,白平衡,色彩模式,光圈……这样拍出的MM才漂亮,而MM可不懂这些,教了半天也不会,幸好数码相机都提供了Facade设计模式,把相机调整到自动档,只要让MM对准目标直接按快门就行了,一切都有相机自动调整,这样MM也可以用这个相机给我拍照了
在这里相机的自动档就充当了门面角色,在拍照时我们可以直接调用这个角色,而不去管相机的那些参数具体怎么设置的,我们只需要跟自动档交互就行了
view plaincopy to clipboardprint?
/**
* 子系统类,多个子系统共同合作完成一个功能
* 调节ISO速度子系统
* @author Administrator
*
*/
public class ISORate {
public void adjust() {
System.out.println("调节ISO速度。。。");
}
}
/**
* 调节白平衡子系统
* @author Administrator
*
*/
public class WhiteBalance {
public void adjust() {
System.out.println("调节白平衡。。。");
}
}
/**
* 调节色彩模式子系统
* @author Administrator
*
*/
public class ColorMode {
public void adjust() {
System.out.println("调节色彩模式。。。");
}
}
/**
* 调节焦距子系统
* @author Administrator
*
*/
public class Foci {
public void adjust() {
System.out.println("调节焦距。。。");
}
}
/**
* 门面类,对位提供统一的接口
* @author Administrator
*
*/
public class DigitalCameras {
private static DigitalCameras dc;
private DigitalCameras() {
}
public static DigitalCameras getDigitalCamerasInstance() {
if(dc == null) {
dc = new DigitalCameras();
}
return dc;
}
public void photoGraph() {
ISORate ir = new ISORate();
WhiteBalance wb = new WhiteBalance();
ColorMode cm = new ColorMode();
Foci fc = new Foci();
ir.adjust();
wb.adjust();
cm.adjust();
fc.adjust();
}
}
客户端调用:
public class FacadeTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DigitalCameras dc = DigitalCameras.getDigitalCamerasInstance();
//直接调用门面类就行,不必和子系统打交道
dc.photoGraph();
}
}
/**
* 子系统类,多个子系统共同合作完成一个功能
* 调节ISO速度子系统
* @author Administrator
*
*/
public class ISORate {
public void adjust() {
System.out.println("调节ISO速度。。。");
}
}
/**
* 调节白平衡子系统
* @author Administrator
*
*/
public class WhiteBalance {
public void adjust() {
System.out.println("调节白平衡。。。");
}
}
/**
* 调节色彩模式子系统
* @author Administrator
*
*/
public class ColorMode {
public void adjust() {
System.out.println("调节色彩模式。。。");
}
}
/**
* 调节焦距子系统
* @author Administrator
*
*/
public class Foci {
public void adjust() {
System.out.println("调节焦距。。。");
}
}
/**
* 门面类,对位提供统一的接口
* @author Administrator
*
*/
public class DigitalCameras {
private static DigitalCameras dc;
private DigitalCameras() {
}
public static DigitalCameras getDigitalCamerasInstance() {
if(dc == null) {
dc = new DigitalCameras();
}
return dc;
}
public void photoGraph() {
ISORate ir = new ISORate();
WhiteBalance wb = new WhiteBalance();
ColorMode cm = new ColorMode();
Foci fc = new Foci();
ir.adjust();
wb.adjust();
cm.adjust();
fc.adjust();
}
}
客户端调用:
public class FacadeTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DigitalCameras dc = DigitalCameras.getDigitalCamerasInstance();
//直接调用门面类就行,不必和子系统打交道
dc.photoGraph();
}
}
四.总结:
门面模式提供了一个高层次的接口,使得子系统更易于使用,每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说他是一个单例模式,但整个系统可以有多个门面类
继续努力,加油!
第二篇
- package facade;
- /**
- *
- * 在实际的开发过程中,往往需要将不同的两个层分离,
- * 比如mvc 三层架构
- * 业务层与表现层、持久层与业务层之间建立外观Facade,
- * 这样为新的系统提供简单的接口。
- */
- //facade类 组合了 三个子系统(每个girl是独立的系统)
- public class Boy {
- private BeautifulGirl beautifulGirl;
- private LivelyGirl livelyGirl;
- private LooksMediocreGirl looksMediocreGirl;
- Boy(){
- beautifulGirl = new BeautifulGirl();
- livelyGirl =new LivelyGirl();
- looksMediocreGirl = new LooksMediocreGirl();
- }
- //我的朋友并不知道我有几个女友,因为女友是我私有的,但是给我朋友做饭的不是我,却是我的女友们。
- //我的朋友到我家做客,他不了解我们家的情况,如果让我的朋友直接命令我的女友做家务,也许他会忙的忘记和我讲正事了(违背了单一职责)
- //我朋友 1————1 我(facade) 1————n girls
- //如果没有了我(facade),那么就变成了 我朋友 1————n girls
- //如果我朋友是待开发的新系统, girls是老系统(之前实现了的)
- //新系统需要用到老的系统提供服务,可是老系统很复杂,
- //开发新系统的人可能不了解老系统是怎么实现的,
- //那么facade 的出现就是提供给新系统 老系统的接口
- public void dinner_for_friend(Friend friend){
- // if...else...可以考虑状态模式重构
- if( friend.getAges()<30){
- this.methodA();
- }else{
- this.methodB();
- }
- }
- public void methodA(){
- beautifulGirl.do_it();
- livelyGirl.do_something();
- looksMediocreGirl.i_can_do();
- }
- public void methodB(){
- looksMediocreGirl.i_can_do();
- livelyGirl.do_something();
- beautifulGirl.do_it();
- }
- }
package facade;
/**
*
* 在实际的开发过程中,往往需要将不同的两个层分离,
* 比如mvc 三层架构
* 业务层与表现层、持久层与业务层之间建立外观Facade,
* 这样为新的系统提供简单的接口。
*/
//facade类 组合了 三个子系统(每个girl是独立的系统)
public class Boy {
private BeautifulGirl beautifulGirl;
private LivelyGirl livelyGirl;
private LooksMediocreGirl looksMediocreGirl;
Boy(){
beautifulGirl = new BeautifulGirl();
livelyGirl =new LivelyGirl();
looksMediocreGirl = new LooksMediocreGirl();
}
//我的朋友并不知道我有几个女友,因为女友是我私有的,但是给我朋友做饭的不是我,却是我的女友们。
//我的朋友到我家做客,他不了解我们家的情况,如果让我的朋友直接命令我的女友做家务,也许他会忙的忘记和我讲正事了(违背了单一职责)
//我朋友 1————1 我(facade) 1————n girls
//如果没有了我(facade),那么就变成了 我朋友 1————n girls
//如果我朋友是待开发的新系统, girls是老系统(之前实现了的)
//新系统需要用到老的系统提供服务,可是老系统很复杂,
//开发新系统的人可能不了解老系统是怎么实现的,
//那么facade 的出现就是提供给新系统 老系统的接口
public void dinner_for_friend(Friend friend){
// if...else...可以考虑状态模式重构
if( friend.getAges()<30){
this.methodA();
}else{
this.methodB();
}
}
public void methodA(){
beautifulGirl.do_it();
livelyGirl.do_something();
looksMediocreGirl.i_can_do();
}
public void methodB(){
looksMediocreGirl.i_can_do();
livelyGirl.do_something();
beautifulGirl.do_it();
}
}
- public class BeautifulGirl {
- public void do_it(){
- System.out.println("来杯咖啡");
- }
- }
public class BeautifulGirl {
public void do_it(){
System.out.println("来杯咖啡");
}
}
- public class LivelyGirl {
- public void do_something(){
- System.out.println("准备午餐");
- }
- }
public class LivelyGirl {
public void do_something(){
System.out.println("准备午餐");
}
}
- public class LooksMediocreGirl {
- public void i_can_do(){
- System.out.println("准备点心");
- }
- }
public class LooksMediocreGirl {
public void i_can_do(){
System.out.println("准备点心");
}
}
- public class Friend {
- int ages;
- public int getAges() {
- return ages;
- }
- public void setAges(int ages) {
- this.ages = ages;
- }
- }