23种设计模式,外观模式的概念优缺点以及JAVA代码举例

简介: 【4月更文挑战第6天】外观模式(Facade Pattern)是一种使用频率非常高的结构型设计模式,其核心思想是为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,外观模式就是客户端与复杂子系统之间的一个简单而统一的接口

外观模式(Facade Pattern)是一种使用频率非常高的结构型设计模式,其核心思想是为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,外观模式就是客户端与复杂子系统之间的一个简单而统一的接口。

外观模式的概念

在软件系统中,由于系统的复杂性及对模块间解耦的需要,引入外观模式可以减少系统的相互依赖,提高灵活性。通过创建一个外观类,可以将复杂的系统流程简化,客户端通过调用外观类的方法来调用子系统中的一系列方法,而不需要直接与子系统交互,减少了系统的耦合度。

外观模式的优点

  1. 降低了客户端与子系统之间的耦合度:客户端只需要与外观类交互,不需要直接与子系统内部的复杂结构打交道。
  2. 简化了客户端的使用过程:为子系统中的一组接口提供了一个一致的界面,使得子系统更加容易被使用。
  3. 提高了系统的灵活性和安全性:外观类封装了子系统的接口,使得对子系统的修改不会影响到客户端。

外观模式的缺点

  1. 不符合开闭原则:当添加新的子系统或者移除现有子系统时,可能需要修改外观类或客户端的代码。
  2. 可能会导致系统过于复杂:如果过度使用外观模式,可能会增加系统中类的数量,从而增加系统的复杂度。

Java代码示例

假设我们有一个复杂的影院管理系统,包含多个子系统,如灯光控制、影音设备控制等。我们可以使用外观模式来简化与这些子系统的交互过程。

首先,定义子系统的接口:

java复制代码

class Light {
    public void on() {
        System.out.println("Light is on");
    }

    public void off() {
        System.out.println("Light is off");
    }
}

class Projector {
    public void on() {
        System.out.println("Projector is on");
    }

    public void off() {
        System.out.println("Projector is off");
    }
}

class SoundSystem {
    public void on() {
        System.out.println("Sound system is on");
    }

    public void off() {
        System.out.println("Sound system is off");
    }
}

然后,创建外观类HomeTheaterFacade

java复制代码

class HomeTheaterFacade {
    private Light light;
    private Projector projector;
    private SoundSystem soundSystem;

    public HomeTheaterFacade(Light light, Projector projector, SoundSystem soundSystem) {
        this.light = light;
        this.projector = projector;
        this.soundSystem = soundSystem;
    }

    public void watchMovie() {
        light.off();
        projector.on();
        soundSystem.on();
        System.out.println("Enjoy the movie!");
    }

    public void endMovie() {
        light.on();
        projector.off();
        soundSystem.off();
        System.out.println("Movie is over");
    }
}

最后,客户端代码示例:

java复制代码

public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(new Light(), new Projector(), new SoundSystem());
        homeTheater.watchMovie(); // 开始看电影
        homeTheater.endMovie(); // 电影结束
    }
}

这个例子展示了如何使用外观模式简化客户端与复杂子系统之间的交互,客户端通过调用外观类的方法来实现操作,无需直接与子系统中的多个类交互,从而简化了客户端与复杂子系统之间的交互操作。

相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
18天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
32 5
Java反射机制:解锁代码的无限可能
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
20天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
57 10
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
6天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
10天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
24 0
|
6月前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
315 1
|
Java BI API
在Java代码中打日志需要注意什么?
日志是什么?日志是你在代码运行时打印出来的一些数据和记录,是快速排查问题的好帮手,是撕逼和甩锅的利器!
701 0

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78