• 欢迎光临~

JAVA设计模式-装饰模式

开发技术 开发技术 2022-10-05 次浏览

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);
    }
}

运行结果

JAVA设计模式-装饰模式

总结

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

原文链接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi---zhuang-shi-mo-shi

程序员灯塔
转载请注明原文链接:JAVA设计模式-装饰模式
喜欢 (0)