侧边栏壁纸
博主头像
Monkey部落博主等级

Monkey部落,分享技术、经验、遇到的问题及解决方法,欢迎大家互相讨论分享。

  • 累计撰写 59 篇文章
  • 累计创建 36 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

JAVA设计模式-装饰模式

Monkey部落
2022-10-05 / 0 评论 / 1 点赞 / 207 阅读 / 844 字

JAVA设计模式-装饰模式

介绍

装饰模式是一种结构型模式,在不改变现有对象结构的前提下,给现有对象添加新的功能,动态增加职责,是现有类的一个包装。

角色

  1. Component:定义一个对象接口。
  2. ConcreteComponent:定义一个对象,是Component的具体实现类,也是被装饰的对象。
  3. Decorator:抽象装饰类,里面定义了和Component一样的接口,并且包含一个Component对象的引用。
  4. 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);
    }
}

运行结果

image-20221005134528261

总结

装饰模式可以动态的扩展一个实现类的功能,动态添加功能或动态撤销,并且不会修改原有对象的结构,是继承的一个替代模式。比较容易搞混的是代理模式,代理模式主要是由代理对象去控制原有对象。装饰模式主要注重增加撤销功能,代理模式主要强调对原有对象的控制。

关注微信公众号「平哥技术站」, 每日更新,在手机上阅读所有教程,随时随地都能学习。

觉得写的还不错的小伙伴,请作者喝杯咖啡☕ ,支持一下。😊

如有侵权请立即与我们联系,我们将及时处理,联系邮箱:865934097@qq.com。

1

评论区