当前位置: 首页 > news >正文

设计模式(四)装饰器模式与命令模式

一、装饰器模式
1、意图

动态增加功能,相比于继承更加灵活

2、类图

Component(VisualComponent):定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent(TextView):定义一个对象,可以给这个对象添加一些职责。

Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。ConcreteDecorator(BorderDecorator、ScrollDecorator):向组件添加职责。

3、实现
public interface Component {void draw();
}
public class ConcreteComponent implements Component{@Overridepublic void draw() {System.out.println("展示一个窗口");}
}

 抽象类实现接口

public abstract class Decorator implements Component{public Component component;Decorator(Component component){this.component=component;}@Overridepublic void draw() {component.draw();}
}
public class ConcreteDecorator1 extends Decorator{ConcreteDecorator1(Component component) {super(component);}@Overridepublic void draw() {System.out.println("给窗口加边框");super.draw();}
}
public class ConcreteDecorator2 extends Decorator{ConcreteDecorator2(Component component) {super(component);}@Overridepublic void draw() {System.out.println("给窗口加滚动条");super.draw();}
}
public class test {public static void main(String[] args) {Component concreteComponent=new ConcreteComponent();Decorator decorator1=new ConcreteDecorator1(concreteComponent);decorator1.draw();System.out.println("------------------------------");Decorator decorator2=new ConcreteDecorator2(concreteComponent);decorator2.draw();}
}
4、效果 

二、命令模式
1、意图

例子:

可以将开关理解成一个请求的发送者,用户通过它来发送一个“开灯”请求,而电灯是“开灯”请求的最终接收者和处理者。

使用不同的电线可以连接不同的请求接收者,只需更换一根电线。相同的发送者(开关)即可对应不同的接收者(电器)​。

含义:

将请求发送者和接收者解耦

发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求

2、类图

Invoker(调用者)​:调用者即请求发送者,一个调用者并不需要在设计时确定其接收者

Receiver(接收者)​:接收者执行与请求相关的操作

Command(抽象命令类)​:抽象命令类一般是一个抽象类或接口 

ConcreteCommand(具体命令类)​:具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法。它对应具体的接收者对象,将接收者对象的动作绑定其中

命令模式的关键在于引入了抽象命令类。请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联

3、实现

 一个请求发送者对应多个请求接收者

/*** 开关*/
public class Invoker {Command command;public Invoker(Command command) {this.command = command;}void call(){command.execute();}}
public interface Command {void execute();
}
public class ConcreteCommand1 implements Command{Receiver1 receiver1;public ConcreteCommand1(Receiver1 receiver1) {this.receiver1 = receiver1;}@Overridepublic void execute() {receiver1.action();}
}
public class ConcreteCommand2 implements Command{Receiver2 receiver2;public ConcreteCommand2(Receiver2 receiver2) {this.receiver2 = receiver2;}@Overridepublic void execute() {receiver2.action();}
}
public class Receiver1 {void action(){System.out.println("打开电灯");}
}
public class Receiver2 {void action(){System.out.println("打开电风扇");}
}
public class test {public static void main(String[] args) {Receiver1 receiver1=new Receiver1();Command command1=new ConcreteCommand1(receiver1);Invoker invoker1=new Invoker(command1);invoker1.call();System.out.println("---------------------------");Receiver2 receiver2=new Receiver2();Command command2=new ConcreteCommand2(receiver2);Invoker invoker2=new Invoker(command2);invoker2.call();}
}
 4、效果

相关文章:

设计模式(四)装饰器模式与命令模式

一、装饰器模式 1、意图 动态增加功能,相比于继承更加灵活 2、类图 Component(VisualComponent):定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent(TextView):定义一个对象,可以给这个对象添加一…...

Android11 修改系统语言

1.定义一个view <RelativeLayoutandroid:id"id/rlChooseLanguage"style"style/SettingAboutItem"><TextViewstyle"style/SettingAboutItemTextView"android:text"string/choose_language" /><ImageView style"st…...

vue3 查看word pdf excel文件

也是在网上找的基础上修改的 可以直接使用 npm install vue-office/docx npm install vue-office/excel npm install vue-office/pdf​<template><divclass"Office-Preview"v-loading"loading"element-loading-text"文件加载中...">…...

java八股-垃圾回收机制-垃圾回收算法,分代回收,垃圾回收器

文章目录 垃圾回收算法引用计数法可达性分析算法 jvm垃圾回收算法标记清除算法标记整理算法复制算法本章总结 JVM中的分代回收本章总结 JVM有哪些垃圾回收器&#xff1f;1.串行垃圾收集器2.并行垃圾收集器3.CMS&#xff08;并发&#xff09;垃圾收集器本章小结 详细聊一下G1垃圾…...

iSCSI 和FC的概述

一、技术基础与架构 iSCSI 技术基础&#xff1a;iSCSI是基于TCP/IP协议的存储网络协议&#xff0c;它实现了在IP网络上运行SCSI协议。架构&#xff1a;iSCSI协议栈包括SCSI层、iSCSI层、TCP/IP层等&#xff0c;通过标准的以太网技术实现存储数据的传输。 FC 技术基础&#xff1…...

一文了解Android中的AudioFlinger

AudioFlinger 是 Android 音频框架中的一个核心组件&#xff0c;负责管理音频流的混合和输出。它是 Android 音频系统服务的一部分&#xff0c;作为音频框架和硬件之间的桥梁&#xff0c;接收应用程序的音频请求、进行混音处理&#xff0c;并最终通过音频硬件输出声音。 ![在这…...

超全面!一文带你快速入门HTML,CSS和JavaScript!

作为一名后端程序员&#xff0c;在开发过程中避免不了和前端打交道&#xff0c;所以就要了解一些前端的基础知识&#xff0c;比如三剑客HTML,CSS,JavaScript&#xff0c;甚至有必要学习一下Vue、React等前端主流框架。 学习文档&#xff1a;https://www.w3school.com.cn/ 一…...

C语言 | Leetcode C语言题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; char* reverseWords(char* s) {int length strlen(s);char* ret (char*)malloc(sizeof(char) * (length 1));ret[length] 0;int i 0;while (i < length) {int start i;while (i < length && s[i] ! ) {i;}for (int p …...

408笔记合集

操作系统 《王道操作系统》-BitHachi 计算机网络 《王道计算机网络》--BitHachi 组成原理 《王道计算机组成原理》--BitHachi...

智慧医疗:纹理特征VS卷积特征

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

OPC学习笔记

一. 解决使用milo读取OPC设备字符串类型时&#xff0c;出现中文和特殊符号乱码的情况 解决前&#xff0c;读取字符串&#xff1a;你好 2. 解决后&#xff0c;读取字符串&#xff1a;你好 3. 解决前&#xff0c;读取字符串&#xff1a;165℃ 解决后&#xff0c;读取字符串&am…...

数据结构的时间复杂度和空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 基本操作的执行次数&#xff0c;为时间复杂度。 我们使用大O的渐进表示法来表示时间复杂度。 怎么使用&#xff1f; 先看例子&#xff1a; 在这个例子中&#xff0c; 基本操作为变量 count 的 加加 操作&#xff0c;并且&#xff0c;执行…...

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…...

生产模式打包

在生产模式下打包 Node.js 和前端&#xff08;例如 Vue 或 React&#xff09;应用时&#xff0c;通常需要对代码进行优化&#xff0c;使其在生产环境中运行更高效。以下是如何在生产模式下配置和打包项目的步骤&#xff1a; 1. Node.js 生产模式打包 Node.js 本身不需要像前端…...

Vue的路由

Vue的路由 出发点&#xff1a;遇到多页面网页的反复跳转&#xff0c;有些繁琐&#xff0c;可以通过Vue的路由实现单页面中数据的变化 实现单页面中数据的变化&#xff08;通过Vue-router来进行操作的&#xff0c;数据的请求获取也需要ajax异步交互&#xff09;&#xff0c;具…...

Spring框架之策略模式 (Strategy Pattern)

策略模式&#xff08;Strategy Pattern&#xff09;详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;用于定义一系列算法&#xff0c;并将每种算法封装到独立的策略类中&#xff0c;使它们可以相互替换&#xff0c;从而使算法的变化独…...

探索Google Earth Engine:利用MODIS数据和R语言进行2000-2021年遥感生态指数(RSEI)的时空趋势分析

前段时间,小编学习了在GEE上进行遥感生态指数(RSEI)的评估,非常头疼,但是实验了两周后,亲测有效,主要采用的是MODIS数据分析了2000-2021年中国内蒙古某地的RSEI时间序列分布状况,现在把学习的代码分享给大家。 1 GEE计算RSEI 1.1研究区域导入与初步定义 var sa = ee…...

多商户中英双语电商系统设计与开发 PHP+mysql

随着全球电商市场的扩展&#xff0c;多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求&#xff0c;尤其是中英双语用户的需求&#xff0c;设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…...

牵手App红娘专属1V1服务,打造贴心交友指导

对于年轻一代而言&#xff0c;婚恋方式已明显区别于传统&#xff0c;他们更倾向于直接、活泼的交流方式&#xff0c;享受着在轻松愉快的氛围中边玩边交友的乐趣。线上社交平台&#xff0c;尤其是那些基于兴趣构建的交友模式&#xff0c;正逐渐成为他们探索爱情、寻找共鸣的新舞…...

论文解析:边缘计算网络中资源共享的分布式协议(2区)

目录 论文解析:边缘计算网络中资源共享的分布式协议(2区) 核心内容: 核心创新点的原理与理论: 多跳边缘计算场景 一、边缘计算的基本概念 二、多跳边缘计算场景的含义 三、多跳边缘计算场景的应用 四、多跳边缘计算场景的优势 论文解析:协作边缘计算网络中资源共…...

论文被吐槽逻辑乱?,有哪些真正实测靠谱的的降AI率工具推荐?

毕业论文降AIGC率&#xff0c;优先选语义重构 去AI痕迹 降查重率的工具&#xff0c;免费与付费结合最稳妥。下面按中文、英文、免费/付费分类推荐&#xff0c;附实测效果与适用场景。 一、中文论文降重工具&#xff08;最常用&#xff09; 1. 千笔AI&#xff08;综合全能首选…...

探索Godot Open RPG:5步打造零基础可玩的回合制RPG游戏

探索Godot Open RPG&#xff1a;5步打造零基础可玩的回合制RPG游戏 【免费下载链接】godot-open-rpg Learn to create turn-based combat with this Open Source RPG demo ⚔ 项目地址: https://gitcode.com/gh_mirrors/go/godot-open-rpg 想开发属于自己的角色扮演游戏…...

51单片机(九)—— 数码管动态扫描原理与实现

1. 数码管动态扫描原理揭秘 第一次接触多位数码管显示时&#xff0c;我盯着电路板百思不得其解&#xff1a;明明只有8个数据引脚&#xff0c;怎么能同时控制8位数码管显示不同内容&#xff1f;直到理解了动态扫描原理&#xff0c;才恍然大悟这背后的精妙设计。动态扫描本质上是…...

VSCode调试ARM芯片:一份给硬件工程师的OpenOCD与J-Link配置清单

VSCode调试ARM芯片&#xff1a;一份给硬件工程师的OpenOCD与J-Link配置清单 当硬件工程师第一次将ARM Cortex-M开发板连接到电脑时&#xff0c;最令人沮丧的莫过于看着闪烁的LED却无法窥探芯片内部的运行状态。调试器就像硬件工程师的"听诊器"&#xff0c;而VSCode配…...

中国象棋AlphaZero:从零构建强化学习象棋AI的完整指南

中国象棋AlphaZero&#xff1a;从零构建强化学习象棋AI的完整指南 【免费下载链接】ChineseChess-AlphaZero Implement AlphaZero/AlphaGo Zero methods on Chinese chess. 项目地址: https://gitcode.com/gh_mirrors/ch/ChineseChess-AlphaZero 中国象棋AlphaZero是一个…...

思源宋体:免费商用中文字体的全面应用指南

思源宋体&#xff1a;免费商用中文字体的全面应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计领域&#xff0c;字体如同视觉沟通的语言。Source Han Serif TTF&…...

Remotely远程控制会话录制:完整监控与分析指南

Remotely远程控制会话录制&#xff1a;完整监控与分析指南 【免费下载链接】Remotely A remote control and remote scripting solution, built with .NET 7, Blazor, and SignalR. 项目地址: https://gitcode.com/gh_mirrors/re/Remotely Remotely是一款基于.NET、Blaz…...

# 发散创新:基于Python与Open3D的数字孪生可视化实时仿真系统构建在工业4.0和智能制造浪潮中,**

发散创新&#xff1a;基于Python与Open3D的数字孪生可视化实时仿真系统构建 在工业4.0和智能制造浪潮中&#xff0c;数字孪生&#xff08;Digital Twin&#xff09; 已成为连接物理世界与虚拟模型的核心技术之一。本文将围绕一个轻量级、高扩展性的数字孪生应用原型系统展开讲解…...

Z-Image-GGUF实战:为Android应用集成AI头像生成功能

Z-Image-GGUF实战&#xff1a;为Android应用集成AI头像生成功能 最近在做一个社交类的Android应用&#xff0c;产品经理提了个需求&#xff0c;想加入一个“AI生成个性头像”的功能。用户上传一张自己的照片&#xff0c;选择喜欢的风格&#xff08;比如动漫风、油画感、像素艺…...

打开软件就弹出d3dcompiler_43.dll丢失找不到 免费下载修复方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…...