首页 > 编程语言 >JAVA设计模式-装饰模式

JAVA设计模式-装饰模式

时间:2022-10-05 14:24:07浏览次数:92  
标签:xpyvip String 装饰 textAreaCompont str input JAVA 设计模式 public

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

总结

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

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

标签:xpyvip,String,装饰,textAreaCompont,str,input,JAVA,设计模式,public
From: https://www.cnblogs.com/aibianchengya/p/16755506.html

相关文章

  • Java IO详解(三)------字节输入输出流
    那么这篇博客我们讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam、FileOutStream)  1、字节输出流:Output......
  • Java IO详解(五)------包装流
    根据功能分为节点流和包装流(处理流)节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.处理流:是对一个已存在的流的连接和封装,通过所封装的流的......
  • Java IO详解(七)------随机访问文件流
    1、什么是随机访问文件流RandomAccessFile?该类的实例支持读取和写入随机访问文件。随机访问文件的行为类似于存储在文件系统中的大量字节。有一种游标,或索引到隐含......
  • (JAVA)偶然看见有人在使用PropertyDescriptor,所以自己测试了一下性能
    packagecom.example.commons.test;importjava.beans.IntrospectionException;importjava.beans.PropertyDescriptor;importjava.lang.invoke.MethodHandle;importjava......
  • JAVA中的可变形参
    例如声明一个类,Food,对方法进行重载classvoidFood(){      }classvoidFood(inta){      }//有一个形参aclassvoidFood(inta,intb){......
  • Java的重载,返回值到底能不能不一样?
    今天在复习八股的时候,突然看到八股提到Java的重载方法,方法返回值可以不同。于是我就去百度,发现答案是不可以。带着这个矛盾的结论,我仔细研读了几个帖子,其实结论是这样的:......
  • java split
    “.”和“|”都是转义字符,必须得加“\\”。如果用“.”作为分隔的话,必须写成String.split("\\."),这样才能正确的分隔开,不能用String.split(".")。如果用“|”作为分隔的......
  • 小猪学Java篇十九(Java基础语法------------Java基础语法总结)
    Java基础语法总结一,大纲:所学内容 (一),注释,标识符,关键字(二)、数据类型(三),类型转换(四),变量,常量(五),运算符(六),包机制,JavaDoc  二,逐个回顾(一),注释,标识符,关键......
  • 2022.10.5java特性和优势
    Java构建工具:Ant,Maven,Jekins应用服务器:Tomcat,Jettty,Jboss,Websphere,weblogicWeb开发:Struts,Spring,Hibernate,myBatis开发工具:Eclipse,Netbean,intellij......
  • 【分享】从Mybatis源码中,学习到的10种设计模式
    作者:小傅哥​沉淀、分享、成长,让自己和他人都能有所收获!......