Java设计模式系列(二):外观模式&装饰器模式

Java设计模式之装饰器模式详细讲解和案例示范 抽象组件(Component):定义一个接口,供具体组件和装饰器继承。具体组件(ConcreteComponent):实现抽象组件接口,代表要装饰的原始对象。装饰器(Decorator):持有一个抽象组件的引用,并实现抽象组件接口。具体装饰器(ConcreteDecorator):继承装饰器,并向其添加新的功能。这种模式的核心思想是将功能附加到对象,而不是通过子类扩展。Spring框架是Java开发中最为流行的框架之一,它通过各种设计模式的运用来实现高扩展性和灵活性。 阅读详情

外观模式(Facade)-6

也叫门面模式,过程模式。

外观模式为子系统中的一组接口提供一致的界面,此模式定义一个高层接口,使得子系统更容易使用。

需求分析

一个家庭影院使用过程:

放下屏幕
开爆米花
开DVD
...
播放DVD
暂停DVD
...
收起屏幕
收起爆米花
关DVD	

使用外观模式,提供高层接口,简化家庭影院操作。

类图关系:

在这里插入图片描述

代码

Client

public class Client {
    public static void main(String[] args) {
        HomeTheatreFacade homeTheatreFacade = new HomeTheatreFacade();
        System.out.println("--ready--");
        homeTheatreFacade.read();
        System.out.println("--play--");
        homeTheatreFacade.play();
        System.out.println("--pause--");
        homeTheatreFacade.pause();
        System.out.println("--end--");
        homeTheatreFacade.end();
    }
}

HomeTheatreFacade

public class HomeTheatreFacade {
    // 子系统
    private DVDPlayer dvdPlayer;
    private Popcorn popcorn;
    private Screen screen;

    // 初始化子系统
    public HomeTheatreFacade() {
        // 结合单例模式
        this.dvdPlayer = DVDPlayer.getInstance();
        this.popcorn = Popcorn.getInstance();
        this.screen = Screen.getInstance();
    }

    // 四个操作步骤

    public void read(){
        screen.down();
        popcorn.open();
        dvdPlayer.on();
    }
    public void play(){
        dvdPlayer.play();
    }
    public void pause(){
        dvdPlayer.pause();
    }
    public void end(){
        dvdPlayer.off();
        popcorn.close();
        screen.up();
    }
}

DVDPlayer

public class DVDPlayer {
    // 单例模式

    private DVDPlayer() {
    }
    private static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstance() {
        return instance;
    }

    public void on(){
        System.out.println("开DVD");
    }
    public void play(){
        System.out.println("播放DVD");
    }
    public void pause(){
        System.out.println("暂停DVD");
    }
    public void off(){
        System.out.println("关闭DVD");
    }
}

Popcorn

public class Popcorn {
    // 单例模式

    private Popcorn() {
    }
    private static Popcorn instance = new Popcorn();

    public static Popcorn getInstance() {
        return instance;
    }

    public void open(){
        System.out.println("开爆米花");
    }
    public void close(){
        System.out.println("收起爆米花");
    }
}

Screen

public class Screen {
    // 单例模式

    private Screen() {
    }
    private static Screen instance = new Screen();

    public static Screen getInstance() {
        return instance;
    }

    public void down(){
        System.out.println("放下屏幕");
    }
    public void up(){
        System.out.println("收起屏幕");
    }
}

举例

slf4j就是门面,它对多种日志框架进行兼容

slf4j-log4j12就是适配器,它适配log4j这种日志

统一接口调用

Logger logger = LoggerFactory.getLogger(HelloServlet.class);

装饰器模式(Decorator )-7

装饰器模式:动态将新功能附加到对象上。在对象扩展方面,比继承更有弹性,装饰者模式也体现了开闭原则(ocp)

问题引入:咖啡+调料问题。增加单品时,由于搭配种类很多,类的数量会暴增,出现类爆炸。考虑使用装饰者模式。

案例:咖啡调料

Component主体:Drink

ConcreteComponent:各单品咖啡

Decorator:各调料

在这里插入图片描述

CoffeeBar

/**
 * 咖啡点单
 */
public class CoffeeBar {
    public static void main(String[] args) {
        // 1、一杯美式
        Drink order = new LongBlack();
        System.out.println("当前组合价格:"+ order.cost());

        // 2、加一份牛奶
        order = new Milk(order);
        System.out.println("当前组合价格:"+ order.cost());

        // 3、加两份巧克力
        order = new Chocolate(order);
        System.out.println("当前组合价格:"+ order.cost());
        order = new Chocolate(order);
        System.out.println("当前组合价格:"+ order.cost());
    }
}

Drink

/**
 * 饮品抽象类
 */
@Data
public abstract class Drink {
    private float price = 0.0f;
    private String description;

    /**
     * 计算费用
     */
    public abstract float cost();
}

Coffee

/**
 * 被装饰者:咖啡类
 */
public class Coffee extends Drink {
    @Override
    public float cost() {
        // 实现Coffee计算逻辑,如基础价格...
        return super.getPrice();
    }
}

Decorator

/**
 * 装饰器:加调料
 */
public class Decorator extends Drink{
    // 被装饰对象:饮料
    private Drink obj;

    public Decorator(Drink obj) {
        this.obj = obj;
    }

    @Override
    public float cost() {
        // getPrice : 调料的价格
        return super.getPrice() + obj.cost();
    }
}

DeCaf

public class DeCaf extends Coffee {
    public DeCaf(){
        setDescription("无因咖啡");
        setPrice(1.0f);
    }
}

LongBlack

public class LongBlack extends Coffee{
    public LongBlack(){
        setDescription("美式咖啡");
        setPrice(5.0f);
    }
}

Milk

public class Milk extends Decorator {
    public Milk(Drink obj) {
        super(obj);
        setDescription("牛奶");
        setPrice(2.0f);
    }
}

Soy

public class Soy extends Decorator {
    public Soy(Drink obj) {
        super(obj);
        setDescription("豆浆");
        setPrice(1.5f);
    }
}

JDK源码解析:InputStream装饰者模式

public class DecoratorDemo {
    public static void main(String[] args) throws IOException {
        /**
         * 1、InputStream --> Drink抽象类
         * 2、DataInputStream --> Milk装饰者
         * 3、FileInputStream --> LongBlack被装饰者
         */
        InputStream inputStream = new DataInputStream(new FileInputStream("C:\\Users\\hhdww\\Desktop\\abc.txt"));
        System.out.println(inputStream.read());
        inputStream.close();
    }
}
Java设计模式大全:23种常见的设计模式详解(二) ​设计模式是一种解决常见软件设计问题的经验总结,它提供了一套可重用的设计思想和方法,帮助开发人员更好地组织和设计他们的代码。在软件开发中,我们经常会遇到一些常见的问题,比如如何实现代码的灵活性、可扩展性、可维护性和可复用性,以及如何减少代码的耦合性等。设计模式通过定义一些通用的解决方案来解决这些问题,从而提高代码的质量和可维护性。 设计模式的概念最早由四位名为Gang of Four(GoF)的作者提出,他们在《设计模式:可复用面向对象软件的基础》一书中总结了23种常见的设计模式。这些设 阅读详情

相关推荐

基于4G cat.1的低功耗车牌识别摄像头模组介绍

在消费类摄像头领域,4G低功耗相机已经非常普遍,在可视门锁,婴儿看护,户外监控等领域都获得了很好的应用.但是在工业领域,低功耗相机的应用还不是那么广泛.这里要介绍一款基于4G cat.1的低功耗车牌识别摄像头模组,在待机状态只有MCU和毫米波雷达以1Hz的频率工作,功耗低至500uA,并可以通过4G模块远程唤醒模组.

bindaz的专栏 1649

Java设计模式之外观模式(UML类图分析+代码详解)

外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当 子系统对象,调用者(Client): 外观接口的调用者,子系统的集合:指模块或者子系统,处理Facade 对象指派的任务,他是功能的实际提供者。

m0_51750419的博客 1975

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1158

java外观模式实例_Java设计模式(11)----------外观模式

1、介绍外观模式是一种结构型设计模式。在外观模式中,外观类中提供一个或者一组对外的接口。客户端对于复杂系统的访问是通过外观类的接口进行的,从而解除了客户端与复杂系统之间的耦合,隐藏了复杂系统内部的逻辑。该设计模式主要解决客户端与复杂系统内部子系统的沟通成本高的问题,通过外观类,简化了沟通流程,降低沟通成本。主要的应用场景有:1、医院的接待员(外观类)。通过接待员,可以实现挂号、缴费和取药等一系列的...

weixin_39959298的博客 288

CST微波工作室端口设置保姆级教程:从波导端口到离散端口,手把手教你搞定S参数仿真

本文提供CST微波工作室端口设置的详细教程,涵盖波导端口和离散端口的选择与配置,助力工程师精准完成S参数仿真。通过微带线滤波器案例,详解端口尺寸、阻抗设置及常见问题排查,提升仿真效率与准确性。

weixin_42570296的博客 362

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 404

设计模式:(四)装饰器、组合、外观、享元模式

一、装饰器模式 1、概述 定义:装饰器(Decorator)模式指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。比继承更有弹性,体现了开闭原则。 2、装饰器模式的主要角色 抽象构件(Component):是一个接口或者抽象类,是定义我们最核心的对象,也可以说是最原始的对象,比如饮料。 具体构件(ConcreteComponent):实现抽象构件,可以单独用,也可通过装饰角色将其进行装饰,比如咖啡。 抽象装饰(Decorator):一般是一个抽

余笙的博客 1078

电压抬升电路设计

一、实验目的 掌握集成运放电压放大电路设计基本方法。 掌握基本仪器使用方法(电源、信号发生器、示波器)。 二、实验内容及结果 实验内容 基于集成运放设计一传感器信号采集电路。传感器输出信号在±50mV,频率为100Hz以内,模数转换器允许输入电压在0~5V,要求设计传感器与模数转换器之间的信号采集电路,实现传感器信号放大10倍,并适合模数转换器的输入。模数转换器的输入电阻为1KHz,设计电路时,可使用1KHz电阻作为信号采集电路负载,代替模数转换器。 实验具体要求如下: (1)确定电路形式,说明电压转

Safaearth的博客 4万+

设计模式8,外观模式、装饰者模式、适配器模式

目录 外观模式 装饰者模式 适配器模式 外观模式 外观模式提供了一个统一的接口,用来访问子系统中的一群接口。 类型:结构型 使用场景:当子系统越来越复杂的时候,增加外观模式可以提供简单调用接口。构建多层系统结构的时候,利用外观对象作为每层的入口,简化层间调用。 优点:简化调用过程,无需深入了解子系统,防止带来风险。减少系统以来,松散耦合。更好的划分访问层次。符合迪米特法则。 缺点...

耗子窝 332

Android TV 遥控器全链路按键适配指南:从物理按键到应用响应

本文深入探讨了Android TV遥控器按键适配方案,涵盖红外和蓝牙遥控器的工作原理及完整适配流程。红外遥控部分详细介绍了从硬件调试、驱动适配到键值映射配置的方法,并提供了实用的调试命令。蓝牙遥控器部分解析了HID协议和报告描述符,给出内核层与Android层的适配代码示例。文章还介绍了游戏手柄、语音遥控器等特殊外设的适配技巧,并提供了系统级调试工具和内核级调试方法,为开发者提供了一套完整的Android TV输入设备适配解决方案。

学无止境 1268

用 SAP ABAP ALV 重塑 SM30:可扩展的自定义表维护视图与自动传输实践

文章摘要: 本文提出了一种基于ALV Grid的动态表维护框架,用于替代传统SM30维护视图。该方案通过输入表名自动生成维护界面,支持动态筛选、批量操作和自动传输管理。核心设计包括:利用BAdI实现扩展点、通过行状态字段简化数据变更跟踪、使用Style Table控制单元格编辑权限、集成CTS实现自动传输。相比SM30标准维护,该框架显著提升了交互体验(支持ALV排序/过滤/汇总)和业务扩展性(统一校验与权限控制),同时解决了"维护+传输"流程割裂的问题。文中详细阐述了技术实现方案,并提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

结构型模式

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

fangfengzhen115的专栏 628

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2996

Java进阶篇设计模式之五-----外观模式和装饰器模式

在上一篇中我们学习了结构型模式的适配器模式和桥接模式。本篇则来学习下结构型模式的外观模式和装饰器模式。

moxiaomo0804的博客 1115

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式java装饰模式范例_Java设计模式中外观模式和装饰器模式的介绍(代码示例)...

本篇文章给大家带来的内容是关于Java设计模式中外观模式和装饰器模式的介绍(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。前言在上一篇中我们学习了结构型模式的适配器模式和桥接模式。本篇则来学习下结构型模式的外观模式和装饰器模式。外观模式简介外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接...

weixin_39877504的博客 104

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

利用外观模式Java投资理财_Java设计模式之外观模式和装饰器模式的设计(精选)...

前言本篇来学习下结构型模式的外观模式和装饰器模式。外观模式简介外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。简单的来说就是对外提供一个简单接口,隐藏实现的逻辑。比如常用电脑的电源键,我们只需按电源键,就可以让它启动或者关闭,无需知道它是怎么启动的(启动CPU、启动内存、启动硬盘),怎么关闭的...

weixin_34360879的博客 99

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java设计模式之五 ----- 外观模式和装饰器模式

前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式。本篇则来学习下结构型模式的外观模式和装饰器模式。 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 简单的来说就是对外提供一个简单接口,隐藏实现的逻辑。比如常用电脑的电源键,我们只需按电源键,就可以让...

weixin_34187862的博客 107

【JAVA长虹键法】第十一式 装饰器模式(23种设计模式)

设计模式之装饰器模式

4万+

Java设计模式:外观模式之优雅门面(九)

外观模式是一种非常实用的设计模式,它通过引入一个统一的接口来隐藏系统的复杂性,使得客户端可以更方便地使用子系统。在实际应用中,我们应该根据具体的需求和场景来选择合适的设计模式,以提高软件系统的可维护性、可扩展性和可重用性。外观模式为我们提供了一个有效的手段来简化客户端的使用和降低系统的复杂性。个人主页。

码到三十五 4826

Java二十三种设计模式-外观模式(9/23)

外观模式(Facade Pattern)是一种常用的结构型设计模式,其核心目的是为一个复杂的子系统提供一个简化的统一接口。通过外观模式,客户端可以访问一个复杂的类系统,而无需了解该系统内部的复杂性。外观模式提供了一种简化复杂系统访问的方法,使得客户端可以更容易地与复杂的子系统交互。通过本文的深入分析,希望读者能够对外观模式有更全面的理解,并在实际开发中做出合理的设计选择。Java二十三种设计模式-单例模式(1/23)Java二十三种设计模式-工厂方法模式(2/23)

小相探索IT世界 1809

java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

前言本篇来学习下结构型模式的外观模式和装饰器模式。外观模式简介外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。简单的来说就是对外提供一个简单接口,隐藏实现的逻辑。比如常用电脑的电源键,我们只需按电源键,就可以让它启动或者关闭,无需知道它是怎么启动的(启动CPU、启动内存、启动硬盘),怎么关闭的...

weixin_30607125的博客 176

【每天一个java设计模式(十)】 - 外观模式

外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 外观模式的实现 假设我们解决一个问题需要经过设计、建模、运行三个阶段,我们使用外观模式来隐藏这三个阶段,只给用户提供一个解决问题的接口。 1. 创建设计类 //设计 public class Design { public void design(){ System.out.println("一:设计"); } } 2.

1+1=王的博客 4031

一文讲完Java常用设计模式(全23种)

设计模式是软件开发中非常有用的工具,可以提高代码的可重用性和可维护性,同时也可以提高开发人员的工作效率。 设计模式有几种类型,包括创建型、结构型和行为型模式。 创建型模式用于以灵活和高效的方式创建对象。包括Singleton模式、工厂模式和抽象工厂模式等。 结构型模式用于组合类和对象以形成更大的结构。包括适配器模式、桥接模式和装饰器模式等。 行为型模式用于处理类或对象之间的通信和控制流。包括观察者模式、策略模式和模板方法模式。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 4万+

【每天一个java设计模式(九)】 - 装饰器模式

装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式属于结构型模式,它是作为现有的类的一个包装。 使用给手机添加不同的功能为例,来实现装饰器模式: 装饰器模式的实现 1. 创建一个产品接口 //产品接口 public interface Product { public void function(); //产品的功能 } 2. 创建一个手机类实现产品接口 //手机实体 public class Phone implements Product { publi

1+1=王的博客 4573

设计模式--外观模式(门面模式)【结构型模式】

外观模式也叫门面模式,主要是降低调用方调用子系统接口的复杂性,它提供一个统一的接口,用于调用子系统中的一组接口,在调用方和实际的接口提供方之间提供提供了⼀个中间层,这个中间层用于包装复杂的调用逻辑,降低业务调用的复杂度。

weixin_42118323的博客 1969

Java二十三种设计模式-装饰器模式(7/23)

装饰器模式是一种设计模式,允许用户在不修改对象自身的情况下,向一个对象添加新的功能。这种模式通过创建一个包装对象,也就是装饰器,来包裹实际对象,从而在不修改实际对象的基础上扩展其功能。装饰器模式提供了一种灵活的方式来扩展对象的功能,而无需改变对象的结构。通过本文的深入分析,希望读者能够对装饰器模式有更全面的理解,并在实际开发中做出合理的设计选择。

小相探索IT世界 1939
上一篇: Java面试之Cookie和Session的区别
下一篇: Linux系列之Shell脚本
Machine4869
博客等级 码龄10年 9粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值