首页 > 编程语言 >Java 设计模式:装饰器模式

Java 设计模式:装饰器模式

时间:2022-11-24 12:12:54浏览次数:42  
标签:Java class public decoratedA call ADecorator 设计模式 装饰

目录

装饰器模式(Decorator Pattern)

概述

所属:结构型模式,作为现有的类的一个包装。

适用时机:扩展某个类的时候。不使用子类继承的方式,避免继承带来的子类膨胀。

优点:

  • 不改变原来类的结构。
  • 与原来类解耦合。

实现

原本接口 interface A,有许多实现类,比如 class A1、class A2。为了拓展 A1、A2 的功能,需要准备一个抽象装饰类 abstract class ADecorator,封装原本接口 interface A(这里就需要将 A 作为 ADecorator 的实例变量,这样 ADecorator 的实现类就可以调用 A 原本的方法)。通过实现抽象装饰类 ADecorator ,来扩展功能。

示例代码如下:

public interface A {
    void call();
}

public class A1 implements A {
    @Override
    public void call() {
        System.out.println("I'm A1.");
    }
}

public class A2 implements A {
    @Override
    public void call() {
        System.out.println("I'm A2.");
    }
}

现在我们首先需要一个抽象装饰类 ADecorator 来封装 A,然后在 ADecorator 的具体实现类 ExtenedADecorator 中扩展其功能:

public abstract class ADecorator implements A {
    protected A decoratedA;

    public ADecorator(A decoratedA){
        this.decoratedA = decoratedA;
    }

    public void call(){
        decoratedA.call();
    }  
}

public class ExtenedADecorator extends ADecorator {

    public ExtenedADecorator(A decoratedA) {
        super(decoratedA);     
    }

    @Override
    public void call() {
        // 在这里拓展,可以直接写在该方法中,这里的扩展示例为调用 extendedMethod(decoratedA);
        decoratedA.call();
	extendedMethod(decoratedA);
    }

    private void extendedMethod(A decoratedA){
        System.out.println("I'm extendedMethod.");
    }
}

那么我们就可以对原来的 A1、A2 进行装饰,调用装饰类方法:

public class DecoratorPatternDemo {
    public static void main(String[] args) {
        
        A a1 = new A1();
        A a2 = new A2();
        
        // 原本调用 call 方法
        a1.call();
        a2.call();
        
        // 使用装饰类
        // 1.装饰原本类
        ADecorator extenedA1 = new ExtenedADecorator(a1);
        ADecorator extenedA2 = new ExtenedADecorator(a1);
        // 2.调用扩展方法
        extenedA1.call();
        extenedA2.call();
        
    }
}

业界实践

在Java中,大部分集合是非线程安全的,然而,在 java.util.Colletions 中,实现了 Synchronized 相关类,装饰非线程安全的 java.util.Colletion 实现类,将其包装为线程安全的实现类。

Colletions 中,SynchronizedCollection 为抽象装饰类装饰接口 Colletion:


而对应的 Synchronized 类作为拓展类,拓展了线程安全的功能。如 SynchronizedSet:

标签:Java,class,public,decoratedA,call,ADecorator,设计模式,装饰
From: https://www.cnblogs.com/meyok/p/16921419.html

相关文章

  • DAY06_Java方法
    d06Java方法(p45-p50)1.什么是方法?System.out.println() 类.对象.方法()调用系统类System中的标准输出对象out中的println()方法Java方法是语句的集合,它们在一起执......
  • Java工具类
    BeanUtils.copyProperties排除null属性的copyimportcom.hourumiyue.system.SpringUtil;importorg.springframework.beans.BeanUtils;importorg.springframework.b......
  • Java对象拷贝原理剖析及最佳实践
    作者:宁海翔1前言对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po、Dto、Do、Vo各个表现层数据的转换,也存在于系统交互如序列化、反序列化。Java对象拷贝分为深拷贝......
  • k8s源码分析5-createCmd中的设计模式
    1、设计模式之建造者模式建造者(Builder)模式:指将一个复杂对象的构造与它的表示分离使同样的构建过程可以创建不同的对象,这样的设计模式被称为建造者模式它是将一个复杂......
  • java.lang.IllegalArgumentException: Invalid character found in the request targe
    摘要:文件下载时,出现如下异常信息:2020-08-2416:18:35:136ErrorparsingHTTPrequestheaderNote:furtheroccurrencesofHTTPrequestparsingerrorswillbelogged......
  • 易语言toJava 集合类
    易语言toJava集合类.版本2.程序集集合Map类,,公开,不允许键存在.程序集变量mContentValueMap,Map,,"0".程序集变量mSplit,文本型,,,&分割符.程序集变量mK......
  • 力扣81(java&python)-搜索旋转排序数组 II(中等)
    题目:已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[......
  • Java重点 | 抽象
    抽象抽象的概念抽象方法和抽象类的格式抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abs......
  • Spring-纯Java创建一个SSM【webapp】
    纯Java搭建webappQuickStart使用纯Java来搭建一个SSM环境,即在项目中,不存在任何XML配置,包括web.xml1创建一个Maven工程引入依赖<!--TODO【Java创建SSM】1......
  • Java中的集合实现赌神、赌圣、赌侠斗地主
    ♣准备牌代码如下://定义一个存储54张牌的ArrayList集合,泛型使用StringArrayList<String>poker=newArrayList<>();//定义两个数组,一个数组存储牌的花色,一个数组存......