绝对精辟,鲜活代码和实例讲授门面设计模式

一.门面模式

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

 

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

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

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


三.举例:

我有一个专业数码相机,在给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代码 复制代码
  1. package facade;   
  2. /**  
  3.  *   
  4.  * 在实际的开发过程中,往往需要将不同的两个层分离,  
  5.  * 比如mvc 三层架构  
  6.  * 业务层与表现层、持久层与业务层之间建立外观Facade,  
  7.  * 这样为新的系统提供简单的接口。  
  8.  */  
  9.  //facade类 组合了 三个子系统(每个girl是独立的系统)   
  10. public class Boy {   
  11.        
  12.     private BeautifulGirl beautifulGirl;   
  13.     private LivelyGirl  livelyGirl;   
  14.     private LooksMediocreGirl looksMediocreGirl;   
  15.        
  16.     Boy(){   
  17.         beautifulGirl = new BeautifulGirl();   
  18.         livelyGirl =new LivelyGirl();   
  19.         looksMediocreGirl = new LooksMediocreGirl();   
  20.     }   
  21.        
  22.     //我的朋友并不知道我有几个女友,因为女友是我私有的,但是给我朋友做饭的不是我,却是我的女友们。   
  23.     //我的朋友到我家做客,他不了解我们家的情况,如果让我的朋友直接命令我的女友做家务,也许他会忙的忘记和我讲正事了(违背了单一职责)   
  24.     //我朋友 1————1 我(facade) 1————n girls   
  25.     //如果没有了我(facade),那么就变成了 我朋友 1————n girls    
  26.     //如果我朋友是待开发的新系统, girls是老系统(之前实现了的)   
  27.     //新系统需要用到老的系统提供服务,可是老系统很复杂,   
  28.     //开发新系统的人可能不了解老系统是怎么实现的,   
  29.     //那么facade 的出现就是提供给新系统 老系统的接口   
  30.     public void  dinner_for_friend(Friend friend){   
  31.            
  32.         // if...else...可以考虑状态模式重构   
  33.         if(  friend.getAges()<30){   
  34.             this.methodA();   
  35.         }else{   
  36.             this.methodB();   
  37.         }   
  38.             
  39.            
  40.     }   
  41.        
  42.     public void methodA(){   
  43.            
  44.         beautifulGirl.do_it();   
  45.         livelyGirl.do_something();   
  46.         looksMediocreGirl.i_can_do();   
  47.            
  48.     }   
  49.     public void methodB(){   
  50.        
  51.         looksMediocreGirl.i_can_do();   
  52.         livelyGirl.do_something();   
  53.         beautifulGirl.do_it();   
  54.     }   
  55.   
  56.        
  57. }  
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代码 复制代码
  1. public class BeautifulGirl {   
  2.        
  3.     public void do_it(){   
  4.            
  5.         System.out.println("来杯咖啡");   
  6.     }   
  7.   
  8. }  
public class BeautifulGirl {
	
	public void do_it(){
		
		System.out.println("来杯咖啡");
	}

}

 

Java代码 复制代码
  1. public class LivelyGirl {   
  2.        
  3.        
  4.     public void do_something(){   
  5.            
  6.         System.out.println("准备午餐");   
  7.     }   
  8.   
  9. }  
public class LivelyGirl {
	
	
	public void do_something(){
		
		System.out.println("准备午餐");
	}

}

 

Java代码 复制代码
  1. public class LooksMediocreGirl {   
  2.   
  3.     public void i_can_do(){   
  4.            
  5.         System.out.println("准备点心");   
  6.            
  7.     }   
  8.        
  9. }  
public class LooksMediocreGirl {

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

 

 

Java代码 复制代码
  1. public class Friend {   
  2.        
  3.     int ages;   
  4.   
  5.        
  6.     public int getAges() {   
  7.         return ages;   
  8.     }   
  9.   
  10.     public void setAges(int ages) {   
  11.         this.ages = ages;   
  12.     }   
  13.        
  14.        
  15.   
  16. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值