JAVA设计模式-装饰模式
2023-03-31 10:45:46 时间
JAVA设计模式-装饰模式
介绍
装饰模式是一种结构型模式,在不改变现有对象结构的前提下,给现有对象添加新的功能,动态增加职责,是现有类的一个包装。
角色
- Component:定义一个对象接口。
- ConcreteComponent:定义一个对象,是Component的具体实现类,也是被装饰的对象。
- Decorator:抽象装饰类,里面定义了和Component一样的接口,并且包含一个Component对象的引用。
- ConcreteDecorator:抽象装饰类Decorator的具体实现类,负责向对象添加职责。
示例
我们以一个文本框为例,文本框可以正常输入信息,我们需要给他添加一些职责,例如输入信息后统计输入的信息长度的功能。
TextAreaCompont
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.decorator
* @Description: 文本框对象接口
* @Author: xpy
* @Date: Created in 2022年10月05日 11:16 上午
*/
public interface TextAreaCompont {
/**
* 输入
* @param str
* @return
*/
String input(String str);
}
TextAreaConcreteCompont
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.decorator
* @Description: 文本框对象类
* @Author: xpy
* @Date: Created in 2022年10月05日 1:19 下午
*/
public class TextAreaConcreteCompont implements TextAreaCompont{
public String input(String str) {
return str;
}
}
TextAreaDecorator
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.decorator
* @Description: 文本框抽象装饰类
* @Author: xpy
* @Date: Created in 2022年10月05日 1:19 下午
*/
public abstract class TextAreaDecorator implements TextAreaCompont{
private TextAreaCompont textAreaCompont;
public TextAreaDecorator(TextAreaCompont textAreaCompont) {
this.textAreaCompont = textAreaCompont;
}
public String input(String str) {
return textAreaCompont.input(str);
}
}
CountTextAreaDecorator
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.decorator
* @Description: 文本框抽象装饰类具体实现类-统计输入字符长度
* @Author: xpy
* @Date: Created in 2022年10月05日 1:19 下午
*/
public class CountTextAreaDecorator extends TextAreaDecorator{
public CountTextAreaDecorator(TextAreaCompont textAreaCompont) {
super(textAreaCompont);
}
@Override
public String input(String str) {
int length = str.length();
System.out.println("输入的字符长度为:" + length);
return super.input(str);
}
}
Test
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.decorator
* @Description: 测试类
* @Author: xpy
* @Date: Created in 2022年10月05日 1:35 下午
*/
public class Test {
public static void main(String[] args) {
TextAreaCompont textAreaCompont = new TextAreaConcreteCompont();
TextAreaDecorator textAreaDecorator = new CountTextAreaDecorator(new TextAreaConcreteCompont());
System.out.println("原始组件输入");
String textAreaCompontInput = textAreaCompont.input("123456");
System.out.println("原始组件输入结果" + textAreaCompontInput);
System.out.println("======================");
System.out.println("装饰之后组件输入");
String textAreaDecoratorInput = textAreaDecorator.input("123456");
System.out.println("装饰之后组件输入结果" + textAreaDecoratorInput);
}
}
运行结果
总结
装饰模式可以动态的扩展一个实现类的功能,动态添加功能或动态撤销,并且不会修改原有对象的结构,是继承的一个替代模式。比较容易搞混的是代理模式,代理模式主要是由代理对象去控制原有对象。装饰模式主要注重增加撤销功能,代理模式主要强调对原有对象的控制。
原文链接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi---zhuang-shi-mo-shi
相关文章
- 深入探讨Java中的异常与错误处理
- 研究学习Kotlin的一些方法
- 数据显示Java热度持续下落,日子屈指可数?
- 2017年5月编程语言排行榜:Java与C语言优势正开始缩小
- Java多线程之内置锁与显示锁
- Java线程池的理论与实践
- 白话阿里巴巴Java开发手册(编程规约)
- 关于Java你不知道的十件事
- Java服务化系统线上应急和技术攻关,你必须掌握的Linux命令
- Java实现高斯模糊和图像的空间卷积
- Java阻塞队列实现原理分析
- NPM使用技巧
- Node.js对Java开发者而言是什么?
- Java反射机制应用实践
- 理解RxJava中的Single和Completable
- 2017年你不能错过的Java类库
- 大规模集群下的Hadoop NameNode
- 从源码解密Spark内存管理
- 2017年3月编程语言排行榜:Swift首次进入前十
- JVM热点技术:Java类的加载机制