当前位置:编程学习 > JAVA >>

设计模式---设计模式之外观模式

第一:场景模拟
   比如说我要买电脑
   第一种办法就是,完全靠自己,自己去买配件,然后自己组装。这个办法要求自己对配件比较熟悉。
   第二种办法就是,找一家专业的装机公司,提出自己的要求, 然后等着拿电脑就行了。
很明显,第二种办法虽然多花钱,可是客户不需要了解那么多。
通过这个场景,我们可以将第二种办法抽象为如下图,也就是我们的外观模式。
第二:问题由来
   示例代码如下
[java]  www.zzzyk.com
package demo02.facade; 
 
/**
 * 示意配置描述的数据Model,真实的配置数据会很多
 */ 
public class ConfigModel { 
    /**
     * 是否需要生成表现层,默认是true
     */ 
    private boolean needGenPresentation = true; 
    /**
     * 是否需要生成逻辑层,默认是true
     */ 
    private boolean needGenBusiness = true; 
    /**
     * 是否需要生成DAO,默认是true
     */ 
    private boolean needGenDAO = true; 
 
    public boolean isNeedGenPresentation() { 
        return needGenPresentation; 
    } 
 
    public void setNeedGenPresentation(boolean needGenPresentation) { 
        this.needGenPresentation = needGenPresentation; 
    } 
 
    public boolean isNeedGenBusiness() { 
        return needGenBusiness; 
    } 
 
    public void setNeedGenBusiness(boolean needGenBusiness) { 
        this.needGenBusiness = needGenBusiness; 
    } 
 
    public boolean isNeedGenDAO() { 
        return needGenDAO; 
    } 
 
    public void setNeedGenDAO(boolean needGenDAO) { 
        this.needGenDAO = needGenDAO; 
    } 

[java] 
package demo02.facade; 
 
/**
 * 示意配置管理,就是负责读取配置文件, 并把配置文件的内容设置到配置Model中去,是个单例
 */ 
public class ConfigManager { 
    private static ConfigManager manager = null; 
    private static ConfigModel cm = null; 
 
    private ConfigManager() { 
 
    } 
 
    public static ConfigManager getInstance() { 
        if (manager == null) { 
            manager = new ConfigManager(); 
            cm = new ConfigModel(); 
            // 读取配置文件,把值设置到ConfigModel中去 
        } 
        return manager; 
    } 
 
    /**
     * 获取配置的数据
     * 
     * @return 配置的数据
     */ 
    public ConfigModel getConfigData() { 
        return cm; 
    } 

[java]
package demo02.facade; 
 
/**
 * 示意生成表现层的模块
 */ 
public class Presentation { 
    public void generate() { 
        // 1:从配置管理里面获取相应的配置信息 
        ConfigModel cm = ConfigManager.getInstance().getConfigData(); 
        if (cm.isNeedGenPresentation()) { 
            // 2:按照要求去生成相应的代码,并保存成文件 
            System.out.println("正在生成表现层代码文件"); 
        } 
    } 

[java]
package demo02.facade; 
 
/**
 * 示意生成逻辑层的模块
 */ 
public class Business { 
    public void generate() { 
        // 1:从配置管理里面获取相应的配置信息 
        ConfigModel cm = ConfigManager.getInstance().getConfigData(); 
        if (cm.isNeedGenBusiness()) { 
            // 2:按照要求去生成相应的代码,并保存成文件 
            System.out.println("正在生成逻辑层代码文件"); 
        } 
    } 

[java] view plaincopyprint?
package demo02.facade; 
 
/**
 * 示意生成数据层的模块
 */ 
public class DAO { 
    public void generate() { 
        // 1:从配置管理里面获取相应的配置信息 
        ConfigModel cm = ConfigManager.getInstance().getConfigData(); 
        if (cm.isNeedGenDAO()) { 
            // 2:按照要求去生成相应的代码,并保存成文件 
            System.out.println("正在生成数据层代码文件"); 
        } 
    } 

[java]
package demo02.facade; 
 
public class Client { 
    public static void main(String[] args) { 
        // 现在没有配置文件,就直接使用默认的配置 
        // 通常情况下,三层都应该生成,也就是说客户端必须 
        // 对这些模块都有了解,才能够正确使用它们 
        new Presentation().generate(); 
        new Business().generate(); 
        new DAO().generate(); 
    } 


通常情况下,三层都应该生成,也就是说客户端必须对这些模块都有了解,才能够正确使用它们,这无疑是个易做图烦,因为客户端不能简单的使用代码,如果某个功能模块发生了变化,还要引起客户端发生变化。
第三:解决办法
   这里就需要我们的装机公司了,也就是今天的主题,外观模式。
   外观模式定义:为子系统的一组接口提供一个一致的界面,Façade模式定了一个高层接口,这个接口使得子系统更加容易使用。如下图

   举一个

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,