【老王公众号】

一天学一个模式_第五天:门面模式

定义:
  门面模式为了系统提供一个统一的顶端接口,供外部客户使用。也是提供一个更高的层次的接口,使得子系统更容易使用。
形式:
  定义一个(或多个)具备所需接口的新类(门面类)
  新类门户使用原来的系统   
      客户使用门面类对象与原系统打交道
使用:
 1、客户只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互时,使用门面模式。   
 2、当需要跟踪原系统的使用情况时 ,使用门面模面模式。因为所有对系统的访问都经过FACADE,所很可以容易的监视系统的使用 。   
 3、 希望封装和隐藏原系统时。   
 4、编写新类的成本小于所有人使用和维护原系统使用所需的成本时
代码解析:
      ①定义接口
          /*
          *<b>类描述:</b >定义接口:写信的过程<br>
   * <b>邮件:</b> yiyu1@163.com <br>
   * @author wonter 
   */
    public interface GuoCheng {
      //信的内容
     public void XinContext(String context);    
     //信封地址,收信人等
     public void Envelope(String address);    
     //将信放入信封
     public void Into();    
     //邮递
     public void sendLetter();
  }
 ②定义实现类,去继承①接口。
         /**
          *<b>类描述:</b >实现类 LetterImp<br>
   * <b>邮件:</b> yiyu1@163.com <br>
   * @author wonter 
   */
  public class LetterImp implements GuoCheng {  
     //写信
     public void XinContext(String context) {
     System.out.println("信的内容"+context);
    }
     //写信封
     public void Envelope(String address) {
     System.out.println("收件人地址及姓名"+address );
    }
     //将信放入信封
     public void Into() {
     System.out.println("将信放入信封");
    }
     //塞到邮箱中,邮递
     public void sendLetter() {
     System.out.println("邮递信");
   }
 ③【不推荐】这时候,你可以直接在main()方法中写信了。
         /**
          *<b>类描述:</b >定义 main() 写信<br>
   * <b>邮件:</b> yiyu1@163.com <br>
   * @author wonter 
   */
                public class ZhouJielun {   
     public static void main(String[] args) {    
       //创建一个处理信件的过程
      GuoCheng guocheng = new LetterImp();     
       //写信
      guocheng.XinContext("你好,方文山,你写的歌词我弄丢了。");   
       //写信封
      guocheng.Envelope("273100,山东,曲阜,方文山");      
       //将信放入信封
      guocheng.Into();      
       //塞到邮箱中,邮递
      guocheng.sendLetter();
   }
     }
 【推荐】④怎么样才能更完美,更适合商业项目
         ③与高内聚的要求相差甚远
         为了让调用者更方便的调用, 就对Sub  System 进行了封装,增加了一个门面,ZhouJielun 调用时,
  直接调用门面的方法就可以了,不用了解具体的实现方法以及相关的业务顺序,
   /**
          *<b>类描述:</b >我们来看程序的改变,GuoCheng 接口和实现类都没有改变,只是增加了一个Moden 类<br>
   * <b>邮件:</b> yiyu1@163.com <br>
   * @author wonter 
   */
  public class Moden {
     private GuoCheng guocheng = new LetterImp();   
      //写信,封装,投递,一体化了
      public void sendLetter(String context,String address){      
       //帮你写信
       guocheng.XinContext(context);     
       //写好信封
       guocheng.Envelope(address);   
       //把信放到信封中
       guocheng.Into();
       guocheng.sendLetter();
    }
  }
         /**
          *<b>类描述:</b >OK   开始 写信
   *                         ZhouJielun的操作简单了很多,提供这种模式后,系统的扩展性也有了很大的提高。<br>
   * <b>邮件:</b> yiyu1@163.com <br>
   * @author wonter 
   */  
   public class ZhouJielun {
     public static void main(String[] args) {
       //邮局,有这项服务
      Moden moden = new Mod();     
       //你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;
      String address = "273100,山东,曲阜,方文山";
      String context = "你好,方文山,你写的歌词我弄丢了。";
      moden.sendLetter(context, address);      
    }  
  }
 
 ⑤突然一个非常时期(比如中美大战),寄往 洛杉矶 的邮件都必须进行安全检查。怎么办呢?
         /**
          *<b>类描述:</b >
   *只是增加了一个 rPolice 变量的声明以及一个方法的调用,那这个写信的过程就变成了这样:先
   *写信,然后写信封,然后警察开始检查,然后才把信放到信封,然后发送出去。
   *<br>
   * <b>邮件:</b> yiyu1@163.com <br>
   * @author wonter 
   */  
  public class Moden {
     private GuoCheng guocheng = new LetterImp();
             //按需要定义Police
      private Police letterPolice = new Police();     
      //写信,封装,投递,一体化了
      public void sendLetter(String context,String address){       
        //帮你写信
        guocheng.writeContext(context);       
        //写好信封
        guocheng.fillEnvelope(address);     
        //警察要检查信件了
        letterPolice.checkLetter(guocheng);       
        //把信放到信封中
        guocheng.into();
       //邮递信件
         guocheng.sendLetter();       
    }
  }
好处:
        门面模式是一个很好的封装方法,一个子系统比较复杂,比如算法或者业务比较复杂,
 就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,在一个较大项目
 中的时候,为了避免人员带来的风险,也可以使用这个模式。
缺点:
  1) 当你要为了一个复杂子系统提供一个简单接口时。在上面已经描述了原因。   
      2) 由于抽象类的实现部分与客户程序之间存在着很大的依赖性。引入 facade 将这个子系统与客户以及其他的子系统分离,
             可以提高子系统的独立性和可移植性(上面也提到了)。   
      3) 当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,
             你可以让它们仅通过 facade 进行通讯,从而简化了它们之间的依赖关系。

posted @ 2011-08-30 13:11  CTO老王  阅读(425)  评论(0编辑  收藏  举报