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);
}
}
运行结果
总结
装饰模式可以动态的扩展一个实现类的功能,动态添加功能或动态撤销,并且不会修改原有对象的结构,是继承的一个替代模式。比较容易搞混的是代理模式,代理模式主要是由代理对象去控制原有对象。装饰模式主要注重增加撤销功能,代理模式主要强调对原有对象的控制。
关注微信公众号「平哥技术站」, 每日更新,在手机上阅读所有教程,随时随地都能学习。
觉得写的还不错的小伙伴,请作者喝杯咖啡☕ ,支持一下。😊
如有侵权请立即与我们联系,我们将及时处理,联系邮箱:865934097@qq.com。
评论区