首页 > 其他分享 >十五:外观模式:简洁的接口

十五:外观模式:简洁的接口

时间:2023-04-30 14:03:15浏览次数:27  
标签:外观 简洁 void 接口 audioSystem 十五 模式 子系统

a. 外观模式揭秘

外观模式(Facade Pattern)是一种将复杂系统隐藏在一个简单接口背后的设计模式。它为子系统中的一组接口提供一个统一的高级接口,使得子系统更容易使用。外观模式有助于解耦客户端与子系统的依赖关系,降低系统复杂性。

b. 一步一步:外观模式实践

假设我们有一个智能家居系统,其中包括灯、音响和空调等多个设备。每个设备都有各自的接口,我们可以通过外观模式为这些设备提供一个简单的接口。 首先,定义各个设备的接口:

interface Light {
    void on();
    void off();
}

interface AudioSystem {
    void playMusic();
    void stopMusic();
}

interface AirConditioner {
    void cool();
    void heat();
}

接着,创建一个外观类,将这些设备的接口集成在一起:

class SmartHomeFacade {
    private Light light;
    private AudioSystem audioSystem;
    private AirConditioner airConditioner;

    public SmartHomeFacade(Light light, AudioSystem audioSystem, AirConditioner airConditioner) {
        this.light = light;
        this.audioSystem = audioSystem;
        this.airConditioner = airConditioner;
    }

    public void homeMode() {
        light.on();
        audioSystem.playMusic();
        airConditioner.cool();
    }

    public void awayMode() {
        light.off();
        audioSystem.stopMusic();
        airConditioner.heat();
    }
}

现在,客户端可以通过外观类的简单接口控制智能家居系统:

public class Main {
    public static void main(String[] args) {
        Light light = new LightImpl();
        AudioSystem audioSystem = new AudioSystemImpl();
        AirConditioner airConditioner = new AirConditionerImpl();

        SmartHomeFacade facade = new SmartHomeFacade(light, audioSystem, airConditioner);
        facade.homeMode();
        facade.awayMode();
    }
}

c. 权衡利弊:外观模式分析

优点:

外观模式简化了客户端与子系统之间的交互,降低了系统的复杂性。 外观模式提供了一个统一的接口,使得子系统更容易使用和维护。 外观模式有助于解耦客户端与子系统的依赖关系,提高系统的可扩展性。

缺点:

外观模式可能会导致功能的封装不完全,有些客户端可能需要访问子系统的更多接口。 如果子系统的功能不断扩展,外观类的接口也需要不断修改,这可能导致系统变得难以维护。

d. 外观模式在开源框架中的应用

在许多开源框架中,外观模式被广泛应用以提供简单易用的接口。例如,在 Spring 框架中,JdbcTemplate 类为我们提供了一个简化的 JDBC 数据库访问接口,它将底层的 JDBC 操作封装在一个简单的 API 中,使得数据库访问更加方便。 下面是一个使用 Spring 的 JdbcTemplate 查询数据库的简单示例:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class Main {
    public static void main(String[] args) {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("password");

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        String sql = "SELECT COUNT(*) FROM users";
        int count = jdbcTemplate.queryForObject(sql, Integer.class);

        System.out.println("User count: " + count);
    }
}

在这个示例中,我们使用 JdbcTemplate 类访问数据库,而无需关心底层的 JDBC 操作。JdbcTemplate 类就像一个外观,提供了一个简单的接口来执行数据库操作。

总结

通过本文,我们深入了解了外观模式及其在开源框架中的应用。外观模式通过提供一个简洁的接口,使得复杂的子系统变得更容易使用和维护。然而,外观模式也有一定的局限性,如功能封装可能不完全,以及随着子系统功能的扩展,外观类的接口需要不断修改。但总的来说,外观模式是一种非常实用的设计模式,在许多场景下都能发挥其优势。

标签:外观,简洁,void,接口,audioSystem,十五,模式,子系统
From: https://blog.51cto.com/u_13616584/6237854

相关文章

  • ActiveMQ学习(四)——应用程序接口…
    在Java里有JMS的多个实现。其中apache下的ActiveMQ用ActiveMQ最好还是了解下JMSJMS公共点对点域发布/订阅域ConnectionFactoryQueueConnectionFactoryTopicConnectionFactoryConnectionQueueConnectionTopicConnectionDestinationQueueTopicSessionQueueSessionTopicSes......
  • 轻松绕过 Graphql 接口爬取有米有数的商品数据
    轻松绕过Graphql接口爬取有米有数的商品数据有米有数数据的API接口,使用的是一种API查询语言graphql。所有的API只有一个入口,具体的操作隐藏在请求数据体里面传输。模拟登录,获取sessionId调用登录接口,进行模拟登录。cookies={}headers={}json_data={'......
  • Python之路【第十五篇】:Web框架
    原笔记链接:https://www.cnblogs.com/wupeiqi/p/4592637.html1.Web框架本质众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。#!/usr/bin/envpython#coding:utf-8importsocketdefhandle_request(client):......
  • 接口OSPF network-type不匹配导致主备倒换后远程无法访问路由器
    #新人福利#问题描述某省广域网口字型组网架构,IGP路由协议采用OSPF协议,业务正常时,远程可以通过主平面上联链路访问主平面路由器,当主平面上联链路故障时,远程应该可以通过备平面与主平面的横连链路访问主设备路由器。某次市广域主备倒换测试时,主平面路由器上联口down后,发现R10远程无法......
  • js循环调用接口,获取每一次接口的值
    vue代码。data数据:list:[{listName:"待办",listNum:0},{listName:"退回",listNum:0},{listName:"已办",listNum:0},{listName:"全部",listNum:0}],methods里面的方法:asyncgetAllData(){this.list.map((listItem,index)=&......
  • 关于京东详情接口如何对接
    京东详情接口是京东购物平台提供的一个重要接口,通过该接口可以获取到商品的详细信息。如果你在开发电商网站或者APP,需要使用到京东的商品信息,那么就需要对接京东详情接口。本文将介绍京东详情接口的使用步骤。一、准备工作在使用京东详情接口之前,需要先注册为京东开发者,然后在京东......
  • 商品详情API接口如何获取淘宝数据
    淘宝是中国最大最受欢迎的电商平台之一,汇集了大量的商家和买家。在淘宝上热门商品的销量经常十分巨大,因此有些开发者和网站想要获取淘宝商品数据来进行一些分析。下面是一篇关于淘宝商品详情API接口获取淘宝数据的文章。一、淘宝商品API接口介绍淘宝开放了API接口,允许开发者获取淘......
  • go语言 数组和切片、可变长参数、maps、字符串、指针、结构体、方法、接口
    数组和切片数组#1定义,初始化,使用#2数组是值类型数字,字符串,布尔,数组,都是值类型,真正直接存数据切片,map,指针引用类型,是个地址,指向了具体的值#3数组长度#4循环打印数组#5多纬数组#6数组定义并赋初值,把第99赋值为1,其他都是0#数组的长度也......
  • 超简单!Java 项目自动生成接口文档教程
    你还在用word、markdown埋头苦干写接口文档?写文档这件事恐怕是每个开发都万分抗拒的事情了。本篇文章详细教你如何利用插件工具,在IDEA中自动生成API文档。先来看看从IDEA中生成文档的效果如下图。下图是使用Apifox插件(Apifoxhelper)从IDEA生成的文档(右)效果。第一步......
  • Java 接口中的方法1.8,为了区别函数式接口
    Java接口中的方法函数式接口式指的式接口冲抽象方法只有一个  函数式接口 java中Comparator接口明明不止一个抽象方法,为什么也算函数式接口?  ......