java设计模式-外观模式

外观模式

外观模式(Facade Pattern)隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个能够统一访问的高层接口,这个接口使得子系统更容易被访问或者使用。

设计原则:最少知识原则:只和你的密友谈话

外观模式-提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。

外观将客户从一个复杂的子系统中解耦。

实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。

模式结构和定义

在这里插入图片描述

外观类(Facade):为调用端提供统一的调用接口,外观类知道那些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象

调用者(Client):外观接口的调用者

子系统的集合 :指模块或者子系统,处理Facade对象指派的任务,他是功能的实际提供者。

应用实例

/**
* 系统A
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemAService {
    public void start() {
        System.out.println("SystemAService start");
    }
    public void on() {
        System.out.println("SystemAService on");
    }
    public void off() {
        System.out.println("SystemAService off");
    }
}
/**
* 系统B
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemBService {
    public void start() {
        System.out.println("SystemBService start");
    }
    public void on() {
        System.out.println("SystemBService on");
    }
    public void off() {
        System.out.println("SystemBService off");
    }
}
/**
* 系统C
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemCService {
    public void start() {
        System.out.println("SystemCService start");
    }
    public void on() {
        System.out.println("SystemCService on");
    }
    public void off() {
        System.out.println("SystemCService off");
    }
}
/**
* 外观服务
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class SystemFacade {
    /**
     * 子系统A
     */
    private SystemAService systemAService;
    /**
     * 子系统B
     */
    private SystemBService systemBService;
    /**
     * 子系统C
     */
    private SystemCService systemCService;
    public SystemFacade() {
        this.systemAService = new SystemAService();
        this.systemBService = new SystemBService();
        this.systemCService = new SystemCService();
    }
    /**
     * start服务
     */
    public void start() {
        systemAService.start();
        systemBService.start();
        systemCService.start();
    }
    /**
     * 统一开服务
     */
    public void on() {
        systemAService.on();
        systemBService.on();
        systemCService.on();
    }
    /**
     * 统一关服务
     */
    public void off() {
        systemAService.off();
        systemBService.off();
        systemCService.off();
    }
}
/**
* 客户端调用
*
* @author shengyong.huang
* @date 2020-06-20
*/
public class Client {
    public static void main(String[] args) {
        SystemFacade systemFacade = new SystemFacade();
        // 调用高层接口,让子系统更容易使用
        systemFacade.start();
        // 调用高层接口,让子系统更容易使用
        systemFacade.on();
        // 调用高层接口,让子系统更容易使用
        systemFacade.off();
    }
}

优点和不足

优点

  • 松耦合:解除客户端和子系统之间的耦合,让子系统内部的模块功能更易于扩展和维护。

  • 易用性:客户端不必知道子系统复杂的内部实现方式,只需跟门面交互即可。

  • 内外分离:子系统中,有些方法是对系统外的,有些方法是对系统内部相互交互使用的。子系统把暴露给外部的功能集中到门面中,从而实现客户端在不知道子系统内部细节前提下的调用

缺点

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

使用场景

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

  • 子系统相互独立

  • 在层析结构中,可以使用外观模式定义系统的每一层的入口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值