首页 > 其他分享 >设计模式之(12)——外观模式

设计模式之(12)——外观模式

时间:2022-09-22 22:14:11浏览次数:49  
标签:wwh ... 外观 12 void System public 设计模式 子系统

  外观模式(facadePattern)又叫门面模式,隐藏了子系统的复杂实现,为子系统中的一组接口提供了一个统一的访问入口,使得子系统容易被访问或使用,说白了就是把复杂的子系统封装成一个接口供给外部用户更简单地使用,这也是一种结构型设计模式。

  模式结构图:

  

   此模式中涉及的三种角色:

  1、门面角色(Facade):外观模式的核心,被客户端调用,它知道子系统的功能,内部根据客户端角色的需求制定了几种功能组合,通过聚合的方式,持有了子系统的引用;

  2、子系统角色:实现了子系统的功能,它对客户端角色和门面角色是未知的,其内部既可以有系统内的相互交互,也可以有共外界调用的接口;

  3、客户端角色:通过调用Facade来完成要实现的功能;

  模式举例:假如我们买了一台车,但是光买完还不够,我们还要交车船税、上车牌、买保险,之后我们才可以上路行驶,可是我们嫌这些流程太繁琐,正好4S店说可以代办这些业务,我们就可以将这些事情委托给4S店代办,这种场景我们就可以将4S店销售人员抽象为门面角色,将缴税、上车牌、买保险抽象为子系统的角色,我们自然就是客户端角色了。

  示例代码如下:

package cn.com.wwh.model.facade;
/**
 * 
 * @version: 1.0
 * @Description: 税务子系统
 * @author: wwh
 * @date: 2022年9月22日-下午8:05:28
 */
public class Tax {
    
    private static final Tax INSTANCE = new Tax();
    
    public static Tax getInstance() {
        return INSTANCE;
    }
    
    public void write() {
        System.err.println("填写资料...");
    }
    
    public void pay() {
        System.err.println("缴税...");
    }
    
    public void getInvoice() {
        System.err.println("获取发票...");
    }
}
package cn.com.wwh.model.facade;

/**
 * 
 * @version: 1.0
 * @Description: 选号子系统
 * @author: wwh
 * @date: 2022年9月22日-下午7:56:38
 */
public class License {

    private static final License INSTANCE = new License();

    public static License getInstance() {
        return INSTANCE;
    }

    public void pay() {
        System.err.println("缴费...");
    }
    
    public void check() {
        System.err.println("验车...");
    }

    public void getLicense() {
        System.err.println("上牌结束...");
    }

}
package cn.com.wwh.model.facade;
/**
 * 
 * @version: 1.0
 * @Description: 保险子系统
 * @author: wwh
 * @date: 2022年9月22日-下午7:57:56
 */
public class Insurance {
    
    private static final Insurance INSTANCE = new Insurance();
    
    public static Insurance getInstance() {
        return INSTANCE;
    }
    
    public void write() {
        System.err.println("填写参保信息...");
    }
    
    public void pay() {
        System.err.println("交钱成功...");
    }
    
    public void success() {
        System.err.println("参保成功...");
    }
}
package cn.com.wwh.model.facade;

/**
 * 
 * @version: 1.0
 * @Description: 销售人员充当外观类角色,通过聚合的方式持有子系统的引用
 * @author: wwh
 * @date: 2022年9月22日-下午8:12:06
 */
public class Saleman {

    private License license;

    private Tax payTax;
    
    private Insurance insurance;

    public Saleman() {
        license = License.getInstance();
        payTax = Tax.getInstance();
        insurance = Insurance.getInstance();
    }

    // 调起税务子系统
    public void invokePayTax() {
        payTax.write();
        payTax.pay();
        payTax.getInvoice();
    }

    // 调起选号子系统
    public void invokeLicense() {
        license.pay();
        license.check();
        license.getLicense();
    }
    
    //调起保险子系统
    public void invokeInsurance() {
        insurance.write();
        insurance.pay();
        insurance.success();
    }

}
package cn.com.wwh.model.facade;
/**
 * 
 * @version: 1.0
 * @Description: 客户端角色
 * @author: wwh
 * @date: 2022年9月22日-下午8:21:25
 */
public class Cluster {

    public static void main(String[] args) {
        Saleman saleman = new Saleman();
        saleman.invokePayTax();
        saleman.invokeLicense();
        saleman.invokeInsurance();
    }
}

 UML类图:

 

  使用场景:

  1、为复杂的模块或子系统提供外界访问的模块;

  2、子系统相互独立;

  3、在层析结构中,可以使用外观模式定义每一层的入口,我们常使用的MVC模式也算是一种外观模式;

  优点:

  1、松散耦合,使得客户端和子系统之间解耦,让子系统内部的功能模块更容易扩展和维护;

  2、简单易用,客户端根本不需要知道子系统的内部实现,或者根本不需要知道子系统的存在,只需要与外观类facade交互即可;

  3、更好的划分层次访问,有些方法是对外的,有些方法是对内的,使用外面模式可以隐藏这些细节,或者说控制一些方法的访问;

  缺点:

  1、不符合开闭原则,如果要改东西很麻烦,继承重写都不合适;

  2、所有的逻辑都依赖门面类,这个类出问题的话可能会影响整个系统;

  总的来说,外观模式的本质是:封装交互,简化调用。让复杂的步骤封装起来,让使用者调用更见简单,减少与子系统的交互。

  好了,今天的介绍就到这,还请各位大佬批评指正,谢谢。

标签:wwh,...,外观,12,void,System,public,设计模式,子系统
From: https://www.cnblogs.com/wha6239/p/16719975.html

相关文章

  • 2022.9.12———HZOI【CPS-S开小灶3】游寄
    \(Preface\)\(Rank35/41\)\(80pts+0pts=80pts\)蒻爆了\(\mathfrak{T1}\世界冰球锦标赛\)这就是我在这里说的那个更板的题,全场就我一个人打记搜,别人没\(A\)都是写......
  • 2022.9.12———HZOI【CSP-S模拟4】游寄
    \(Preface\)\(Rank32/43\)\(0pts+40pts+40pts+20pts=100pts\)\[\Huge\mathbf{水博客警告}\]\(\mathfrak{T1}\石子游戏\)\(mad\)上来一个博弈论呼我脸上,这......
  • 1.设计模式-单例
    单例模式单例模式的核心是保证一个类只有一个实例,并且提供一个访问实例的全局访问点。单例的使用场景Spring中bean对象的模式实现方式servlet中每个servlet的实例s......
  • 将{"123","456"}集合转化为('123','456')
    需求分析优化接口时,需要手动拼接sql去调取神策的接口获取数据。好比将List<String>={"123","456"}集合转化为('123','456')。1publicclasstest3{23p......
  • P3530 [POI2012]FES-Festival
    传送门思路对于第一种限制,我们连接\((x,y)=1\),\((y,x)=-1\)对于第二种限制,我们连接\((x,y)=0\)如果一个图只有第一种边,那么要么就是没有解(有环),要么答案就是点的个数......
  • 设计模式-创建型模式之工厂
    一、简单工厂创建对象的工作交由统一的函数接口来管理,传入不同的参数,返回不同的类对象1classAqSb:23def__repr__(self):4return"按期申......
  • JAVA中容器设计的进化史:从白盒到黑盒,再到跻身为设计模式之一的迭代器
    大家好,又见面了。在我们的项目编码中,不可避免的会用到一些容器类,我们可以直接使用List、Map、Set、Array等类型。当然,为了体现业务层面的含义,我们也会根据实际需要自行封......
  • VS2012使用nuget时提示”基础连接已关闭“基础连接已经关闭: 未能为 SSL/TLS 安全通道
    上手运维着几个老系统,需要使用VS2012,最近使用NUGET的时候,总是提示“基础连接已经关闭:未能为SSL/TLS安全通道建立信任关系”,网上找了好久,基本上都是说修改注册表就可以,......
  • 类欧几里得,以及ARC111E和ARC123E
    例题https://atcoder.jp/contests/practice2/tasks/practice2_c在\(O(\log(n+m+k+b))\)的时间复杂度求:\[\sum_{i=0}^{n-1}\lfloor{\frac{ki+b}{m}}\rfloor\]其中\(n,......
  • 设计模式---原型模式
    简述类型:创建型目标:通过拷贝快速创建相同或相似对象。接下来我们看一个需要改进的案例。优化案例话不多说,先来看一个创建相同或相似对象的传统写法。原版v0public......