精辟--门面设计模式
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();
}
}
Java代码
public class BeautifulGirl {
public void do_it(){
System.out.println("来杯咖啡");
}
}
Java代码
public class LivelyGirl {
public void do_something(){
System.out.println("准备午餐");
}
}
Java代码
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;
}
}
外部与一个子系统的通信必须通过一个统一的门面对象进行
二.门面模式涉及到的角色:
门面角色:客户端可以调用这个角色的方法,此角色知晓相关的一个或多个子系统的功能和责任,通常情况下,此角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统角色:可以同时拥有一个或多个子系统,每一个子系统可以不是一个单独的类,而是一个类的集合,每一个子系统都可以直接被客户端调用或者被门面角色调用,子系统并不知道门面角色的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
三.举例:
我有一个专业数码相机,在给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;
}
}
相关文章推荐
- 绝对精辟,鲜活代码和实例讲授门面设计模式
- java设计模式----外观模式(门面模式)
- 设计模式-门面模式(Facade)
- 设计模式_门面模式
- 设计模式解密(5)- 外观模式(门面模式)
- 设计模式之门面模式
- 设计模式之门面模式
- JAVA设计模式之外观模式(门面模式)
- 设计模式-13-门面模式
- 设计模式系列 - 门面模式(Facade)
- Design Pattern Facade 门面设计模式
- 设计模式——门面模式【Facade Pattern】
- IOS设计模式之二(门面模式,装饰器模式)
- Android 中设计模式 ----门面模式
- 设计模式利剑17-门面模式
- 设计模式7 - 门面模式【Facade Pattern】
- js设计模式-门面模式
- 设计模式-门面模式
- 设计模式——门面模式
- java设计模式之外观模式(门面模式)