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

news2024/11/14 16:14:08
一、装饰器模式
1、意图

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

2、类图

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

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

3、实现
public interface Component {
    void draw();
}
public class ConcreteComponent implements Component{

    @Override
    public void draw() {
        System.out.println("展示一个窗口");
    }
}

 抽象类实现接口

public abstract class Decorator implements Component{
    public Component component;

    Decorator(Component component){
        this.component=component;
    }

    @Override
    public void draw() {
        component.draw();
    }
}
public class ConcreteDecorator1 extends Decorator{
    ConcreteDecorator1(Component component) {
        super(component);
    }

    @Override
    public void draw() {
        System.out.println("给窗口加边框");
        super.draw();
    }
}
public class ConcreteDecorator2 extends Decorator{
    ConcreteDecorator2(Component component) {
        super(component);
    }

    @Override
    public 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;
    }

    @Override
    public void execute() {
        receiver1.action();
    }
}
public class ConcreteCommand2 implements Command{
    Receiver2 receiver2;

    public ConcreteCommand2(Receiver2 receiver2) {
        this.receiver2 = receiver2;
    }

    @Override
    public 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、效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PL/SQL执行.sql文件

1.编写.sql文件,创建update.sql文件,文件如下: set feedback offset define off--更新表中所有人的年龄update a set age18;prompt Done. 2.打开plsql选择命令窗口,即选择File->New->Command Window; 打开后的…

改扩配系列:浪潮英政服务器CS5280H2、IR5280H2——板载前置3.5寸*12口背板

机器配置情况 机器是云产品原厂配置的超融合一体机3.5*12背板出厂接法,前置是硬盘背板作为超融合数据盘是直通的,使用板载接口没有过raid卡。 主板上的接口既是pcie转接卡的接口,又是sata控制器的接口,如果是nvme_ssd我能理解&am…

【3D Slicer】的小白入门使用指南四

开源解剖影像浏览工具Open Anatomy Browser使用及介绍 和3D slicer米有太大关系,该工具是网页版影像数据的浏览工具(可以简单理解为网页版的3D slicer) 介绍 ● 开放解剖(OA)浏览器是由神经影像分析中心开发的,基于网络浏览器技术构建的图谱查看器。 ● OA浏览器将解剖模…

基于正则化算法的SAR图像去噪matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1SAR 图像噪声模型 4.2 正则化算法基本原理 5.完整工程文件 1.课题概述 基于正则化算法的SAR图像去噪matlab仿真,仿真输出SAR图像去噪结果,正则化参数收敛曲线,同时…

【2024软考架构案例题】你知道 Es 的几种分词器吗?Standard、Simple、WhiteSpace、Keyword 四种分词器你知道吗?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

qt QUndoCommand 与 QUndoStack详解

1、概述 QUndoCommand 和 QUndoStack 是 Qt 框架中用于实现撤销/重做(undo/redo)功能的两个核心类。QUndoCommand 是表示单个可撤销操作的基类,而 QUndoStack 则负责管理这些命令的堆栈,提供撤销和重做操作的接口。 QUndoCommand…

数据分析:16s差异分析DESeq2 | Corncob | MaAsLin2 | ALDEx2

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍DESeq2原理计算步骤结果Corncob原理计算步骤结果MaAsLin2原理计算步骤结果ALDEx2原理计算步骤结果加载R包数据链接数据预处理微生物数据样本信息提取物种名称过滤零值保留结果读取…

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)

在前端开发中,模块化是一个重要的概念,不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module,因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…

python入门3

IDE的概念 IDE(Integrated Development Environment)又被称为集成开发环境。说白了,就是有一款图形化界面的软件,它集成了编辑代码,编译代码,分析代码,执行代码以及调试代码等功能。在我们Python开发中,最常…

【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看

【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看 2024年 5月20日-6月4日:攻克2D物理引擎。 2024年 6月4日-6月13日:攻克《3D数学基础》。 2024年 6月13日-6月20日:攻克《3D…

机器情绪及抑郁症算法

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月12日17点02分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17230869054974 计算机来理解你的情绪&a…

建设展示型网站企业渠道用户递达

展示型网站的主要作用便是作为企业线上门户平台、信息承载形式、拓客咨询窗口、服务/产品宣传订购、其它内容/个人形式呈现等,网站发展多年,现在依然是企业线上发展的主要工具之一且有建设的必要性。 谈及整体价格,自制、定制开发、SAAS系统…

【Jenkins实战】Windows安装服务启动失败

写此篇短文,望告诫后人。 如果你之前装过Jenkins,出于换域账号/本地帐号的原因想重新安装,你大概率会遇上一次Jenkins服务启动失败提示: Jenkins failed to start - Verify that you have sufficient privileges to start system…

vue自定义计算器组件

自定义组件实现以下简单的计算器功能&#xff1a; 创建计算器组件文件calculator.vue&#xff0c;代码如下&#xff1a; <template><div class"calculator"><!-- 当前运算过程显示区域 --><div class"expression">{{ currentExpr…

耗时2个月,我整理出一套牛客网最热门的Java面试题合集!能够轻松应对面试官的“连环炮”

说快也快&#xff0c;说不快也不慢&#xff01; 年前&#xff0c;陆陆续续&#xff0c;好多大厂都在裁员&#xff1b; 年后&#xff0c;又有一大批程序员失业&#xff0c;找不到避风港&#xff1b; 这时候&#xff0c;就有人说了&#xff0c;为什么找工作这么难&#xff1f;…

无人驾驶汽车——AI技术在交通领域的进展与未来展望

文章目录 前言什么是无人驾驶汽车?特斯拉的无人驾驶愿景无人驾驶的技术进程:从DARPA挑战赛到特斯拉中国无人驾驶技术的现状谷歌的加入与优步的竞争深度学习的到来与特斯拉的独特优势无人驾驶的未来:机遇与挑战总结前言 今天,我想通过讲一个故事,帮助大家更好地理解无人驾…

【优选算法篇】化繁为简,见素抱朴:从乱象中重构秩序的艺术

文章目录 分治专题&#xff08;一&#xff09;&#xff1a;快速排序核心思想与应用前言第一章&#xff1a;快速排序的应用与延展1.1 颜色分类&#xff08;medium&#xff09;解法&#xff08;分治思想 - 三指针法实现三分&#xff09;C 代码实现易错点提示时间复杂度和空间复杂…

Python多进程间通讯(包含共享内存方式)

文章目录 1 通过非共享内存配合队列方式2 通过共享内存配合队列方式 注&#xff1a;本博文测试环境为Linux系统。 1 通过非共享内存配合队列方式 下面是一个常见的生产者与消费者的模式示例&#xff0c;这里分别启动了两个子进程&#xff0c;一个为生产者&#xff08;producer…

平台整合是网络安全成功的关键

如今&#xff0c;组织面临着日益复杂、动态的网络威胁环境&#xff0c;随着恶意行为者采用越来越阴险的技术来破坏环境&#xff0c;攻击的数量和有效性也在不断上升。我们最近的 Cyber​​Ark 身份威胁形势报告&#xff08;2024 年 5 月&#xff09;发现&#xff0c;去年 99% 的…

冒泡选择法(c基础)

适合对象c语言初学者。 冒泡选择法 作用对一个数组进行排序。&#xff08;介绍一下数组(c基础)(详细版)-CSDN博客&#xff09; 核心要点 1: 数组元素个数 sz 2: 比较后的交换。 核心思路 进行&#xff08;sz - 1&#xff09;趟&#xff0c;每一趟把最大数的放到末尾。其…