装饰设计模式

职责:

动态的为一个对象增加新的功能。

装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。

使用对象的关联关系代替继承关系,更加灵活,同事避免类型体系的快速膨胀。


使用场景:

1.IO流中输入流和输出流

2.Swing包中图形界面构件功能

3.Servlet API中济公了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper,

这个类增加了request对象的功能。

4.struts2中,request,response,session对象的处理。


实现细节:

Component抽象构件角色:

真实对象和装饰对象有相同的接口,这样,客户端对象就能够与真实对象相同的方式同装饰对象交互

ConcreteComponent具体构件角色(真实对象):io流中的FileInputStream、FileOutputStream

Decorator装饰角色:

持有一个抽象构件的引用,装饰对象接收所有客户端的请求,并把这些请求转发给真实对象。这样

就能在真实对象调用前后增加新的功能。

ConcreteDecorator具体装饰角色:

负责给构件对象增加新的责任。

类图:


抽象构件:

package com.gcxzflgl.decorator;/*** 抽象构建* @author Administrator**/
public interface ICar {void move();
}//ConcreteComponent 具体构件角色(真实对象)
class Car implements ICar {@Overridepublic void move() {System.out.println("陆地上跑!");}
}//Decorator装饰角色
class SuperCar implements ICar {protected ICar car;public SuperCar(ICar car) {super();this.car = car;}@Overridepublic void move() {car.move();}
}//ConcreteDecorator具体装饰角色
class FlyCar extends SuperCar {public FlyCar(ICar car) {super(car);}public void fly(){System.out.println("天上飞!");}@Overridepublic void move() {super.move();fly();}}//ConcreteDecorator具体装饰角色
class WaterCar extends SuperCar {public WaterCar(ICar car) {super(car);}public void swim(){System.out.println("水上游!");}@Overridepublic void move() {super.move();swim();}}//ConcreteDecorator具体装饰角色
class AICar extends SuperCar {public AICar(ICar car) {super(car);}public void autoMove(){System.out.println("自动跑!");}@Overridepublic void move() {super.move();autoMove();}}

客户端调用:

package com.gcxzflgl.decorator;public class Client {public static void main(String[] args) {Car car  = new Car();car.move();System.out.println("增加新的功能,飞行----------");FlyCar flycar = new FlyCar(car);flycar.move();System.out.println("增加新的功能,水里游---------");WaterCar  waterCar = new WaterCar(car);waterCar.move();System.out.println("增加两个新的功能,飞行,水里游-------");WaterCar waterCar2 = new WaterCar(new FlyCar(car));waterCar2.move();}
}

总结:装饰模式也叫包装器模式

装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和

具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。


优点:

扩展对象功能,比继承灵活,不会导致类个数急剧增加

可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象

具体构建类和具体装饰类可以独立变化,用户可以根据需要增加自己新的具体构建子类和具体装饰子类。

缺点:

产生很多小对象,大量小对象占据内存,一定程度上影响性能。

装饰模式易于出错,调试排查比较麻烦。

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

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

相关文章

夏日的清凉好装备,华为FreeBuds 4能说的不只舒适降噪

现如今,耳机就像智能手机一样,正慢慢成为我们的“感官”之一,即使是在如此炎热的夏日,人们出行的装备越来越少,但始终会有真无线耳机的一席之地。随着功能的丰富,耳机的使用场景也不仅限于通勤路上的“解闷儿”工具,更多的是可以融入到工作和生活的每个细节。就比如刚刚过去的端…

雨中重装徒步攀登清凉峰

《雨中重装徒步攀登清凉峰》 经历忙碌的一周工作后,本该在周六睡个懒觉,因报名参加了天涯俱乐部组织的重装徒步攀登清凉峰活动,只能在五点起床,洗漱,吃完早饭后,背上登山包后赶往集合地点。 清凉峰&#xf…

清凉的夏天

世界上有一种东西叫做夏天。阳光、沙滩、还有你最爱的澄汁。喜欢趴在地板上看着你的白汗衫在阳光下飘动你告诉我,我会飞上碧蓝的天你答应我那天送我的一双水晶鞋我说不用,只要你为我拾一颗石头,能永远沉在我心底我喜欢把心情写在日记本里&…

我的Q秀场

这是我最初最钟爱的一个Q秀。 自打上面我原来那美美的QQ秀过期之后,我就只能穿着清凉的过了好多天,如下图所示: 今天又找了一套衣服,可是不是免费的,很遗憾的是我穷的买不起。所以,只能穿上截个…

JSON文件读写教程【jsoncpp源码编译】【结尾附三方库下载链接】

目录 1 数据下载(jsoncpp源码)2 文件编译3 测试用例4 下载链接:内容: JSON文件的读取与保存可以使用jsoncpp库来实现,这里介绍该库的下载及编译方法。 1 数据下载(jsoncpp源码) 数据下载:Github地址 图1 github源码示意图 2 文件编译 2.1 点击Download ZIP,下载源码。 …

通过参数化可变形曲线直接从 X 射线投影数据计算分割研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

第一课 海边漫步

一、目的 1.初步了解编程思维方式 2.熟悉Scratch整体界面布局 3.了解背景与角色 4.了解坐标概念 二、内容 1.积木区: (1)代码标签:Scratch支持的所有代码积木, 通过这些积木,实现Scratch代码编写,实现编程目标。如图 (2)造型/背景标签:绘制或修改背景和角色…

使用python对有限数点进行随机漫步

有关python的随机漫步,使用python来生成随机漫步数据,再使用Matplotlib以能令人清晰可见的方式看到随机漫步后得到的图表。 首先,创建一个叫做“随机漫步”的python文件,我们创建一个名为RandomWalk的类,让计算机随机…

南卡和万魔还有漫步者蓝牙耳机哪个好?半入耳式蓝牙耳机对比

蓝牙耳机什么牌子好?这个问题,是一个仁者见仁、智者见智的问题。为了搞清这个问题,我也是入手了现在最热门最受欢迎的3款性价比国产蓝牙耳机,分别是南卡Lite pro2、漫步者lollipopds和万魔舒适豆。如果将三者对比起来使用&#xf…

【Python】随机漫步

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、创建 RandomWalk 类 3、随机选择方向 4、绘制随机漫步图 5、总结 1、缘起 本篇博客将使用 Python 来生成随机漫…

数据可视化—随机漫步

✅作者简介:大家好我是hacker707,大家可以叫我hacker 📃个人主页:hacker707的csdn博客 🔥系列专栏:python 💬推荐一款模拟面试、刷题神器👉点击跳转进入网站 随机漫步 创建RandomWalk类选择方向…

City walk火了,这3种城市漫步模式了解一下

目 录 1. 城市需要什么样的City walk 2. City walk模式一:「有目标」 3. City walk模式二:「故事化」 4. City walk模式三:「小而密」 关键词: 城市漫步 | 城市更新 | 街区改造 文化旅游 | 微度假 | 扩内需 City walk&#xff08…

7 集群基本测试

1. 上传小文件到集群 在hadoop路径下执行命令创建一个文件夹用于存放即将上传的文件: [atguiguhadoop102 ~]$ hadoop fs -mkdir /input上传: [atguiguhadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/work.txt /input2.上传大文件 [atguiguhadoop1…

使用OpenCV-python对植物图片进行分类

文章目录 图片分类的思路和需要加载的库函数说明核心代码分析数据预处理:文件处理和命名匹配数据预处理:特征提取和标签提取学习模型:数据划分和模型训练预测输出:利用训练好的模型进行图片分类 完整代码附录和运行结果 图片分类的…

学习记录:Unity点击屏幕生成随机UI花朵

1 效果展示 点击屏幕的位置生成花朵&#xff0c;生成的花朵等5秒后自动销毁。 2 代码展示 1 生成花朵的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 鼠标点击生成花朵 /// </summary> public clas…

利用Python制造出七彩花朵

文章目录 前言小海龟花朵类移动函数画花朵 前言 来啦来啦来啦&#xff0c;小伙伴们快快来领取七彩花瓣雨吧&#xff01;&#xff01; 小海龟 老生常谈啦&#xff0c;在用python画樱花树前&#xff0c;我们先来了解一下turtle吧&#xff01; 小海龟(Turtle)是Python中画图的…

深度学习花朵识别系统的设计与实现

摘要&#xff1a;该项目是基于Keras的VGG16模型微调实现的深度学习花朵识别检测系统&#xff0c;使用Python语言中的cv2和numpy库对图像进行预处理&#xff0c;使用keras的ImageDataGenerator进行数据增强&#xff0c;采用Pyqt5实现功能的可视化&#xff0c;方便用户对图片进行…

使用Pytorch实现图像花朵分类

基于pytorch-classifier这个源码进行实现的图像分类 代码的介绍在这个链接里面&#xff0c;这篇博客主要是为了带着大家通过实践的方式熟悉一下代码的使用&#xff0c;并且了解相关功能。 1. 下载相关资料 这里我提供了一个花朵数据集&#xff0c;里面总共有十个类别的花朵作…

“花朵分类“ 手把手搭建【卷积神经网络】

前言 本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类; 使用到TF的花朵数据集,它包含5类,即:“雏菊”,“蒲公英”,“玫瑰”,“向日葵”,“郁金香”;共 3670 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,…

(笔记一)利用open_cv在图像上进行点标记,文字注记,画圆、多边形、椭圆

&#xff08;1&#xff09;CV2中的绘图函数&#xff1a; cv2.line() 绘制线条cv2.circle() 绘制圆cv2.rectangle() 绘制矩形cv2.ellipse() 绘制椭圆cv2.putText() 添加注记 &#xff08;2&#xff09;注释 img表示需要绘制的图像color表示线条的颜色&#xff0c;采用颜色矩阵…