您的位置:首页 > 其它

精辟--门面设计模式

2009-12-20 12:45 309 查看
一.门面模式

外部与一个子系统的通信必须通过一个统一的门面对象进行

二.门面模式涉及到的角色:

门面角色:客户端可以调用这个角色的方法,此角色知晓相关的一个或多个子系统的功能和责任,通常情况下,此角色会将所有从客户端发来的请求委派到相应的子系统去。

子系统角色:可以同时拥有一个或多个子系统,每一个子系统可以不是一个单独的类,而是一个类的集合,每一个子系统都可以直接被客户端调用或者被门面角色调用,子系统并不知道门面角色的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

三.举例:

我有一个专业数码相机,在给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();
}

}

四.总结:

门面模式提供了一个高层次的接口,使得子系统更易于使用,每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说他是一个单例模式,但整个系统可以有多个门面类

继续努力,加油!

第二篇

Java代码



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();
}

}


Java代码



public class BeautifulGirl {

public void do_it(){

System.out.println("来杯咖啡");

}

}

public class BeautifulGirl {

public void do_it(){

System.out.println("来杯咖啡");
}

}


Java代码



public class LivelyGirl {

public void do_something(){

System.out.println("准备午餐");

}

}

public class LivelyGirl {

public void do_something(){

System.out.println("准备午餐");
}

}


Java代码



public class LooksMediocreGirl { public void i_can_do(){ System.out.println("准备点心"); } }
public class LooksMediocreGirl {

public void i_can_do(){

System.out.println("准备点心");

}

}


Java代码



public class Friend {

int ages;

public int getAges() {

return ages;

}

public void setAges(int ages) {

this.ages = ages;

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: