外观模式

首先介绍一下迪米特法则(最少知识原则): 
一个软件实体应当尽可能少的与其他实体发送相互作用。 
外观模式就是迪米特法则的体现,它为系统提供统一的入口。封装子系统的复杂性,便于客户端调用。

用代码来说明: 
  如果有人需要开店,那么他就需要到工商局,税务局,银行,质监局办理各种手续,创建上面的各种类:

  

public interface 工商局  {
    void checkName();  //核名
}

class 海淀区工商局 implements 工商局 {

    @Override
    public void checkName() {
        System.out.println("检查名字是否有冲突!");
    }

}


public interface 税务局 {
    void taxCertificate();  //办理税务登记证
}


class 海淀税务局 implements 税务局 {

    @Override
    public void taxCertificate() {
        System.out.println("在海淀税务局办理税务登记证!");
    }

}


public interface 银行 {
    void  openAccount();  //开户
}


class 中国工商银行 implements 银行 {

    @Override
    public void openAccount() {
        System.out.println("在中国工商银行开户!");
    }

}


public interface 质检局 {
    void  orgCodeCertificate();  //办理组织机构代码证
}



class 海淀质检局 implements 质检局 {

    @Override
    public void orgCodeCertificate() {
        System.out.println("在海淀区质检局办理组织机构代码证!");
    }

}

  如果在客户端直接调用各个类,那么就会使得客户端与系统之间的耦合度太高,为了降低耦合度,可以实现一个统一的facade供客户端调用:

public class RegisterFacade {
    public void register(){
        工商局  a = new 海淀区工商局();
        a.checkName();
        质检局 b = new 海淀质检局();
        b.orgCodeCertificate();
        税务局  c  = new 海淀税务局();
        c.taxCertificate();
        银行  d = new 中国工商银行();
        d.openAccount();
    }
}

  最后,客户端调用代码如下:

public class Client1 {
    public static void main(String[] args) {
    //不使用外观模式的调用
//      工商局  a = new 海淀区工商局();
//      a.checkName();
//      质检局 b = new 海淀质检局();
//      b.orgCodeCertificate();
//      税务局  c  = new 海淀税务局();
//      c.taxCertificate();
//      银行  d = new 中国工商银行();
//      d.openAccount();

        //使用外观模式
        new RegisterFacade().register();

    }
}

  

 外观模式在开发中的应用: 
JDBC封装后commons提供的DBUtils类; 
Hibernate提供的工具类;

posted @ 2018-01-10 10:32  jianhuazhao  阅读(133)  评论(0编辑  收藏  举报