首页 > 编程语言 >Java-Spring框架中用到的设计模式

Java-Spring框架中用到的设计模式

时间:2023-12-08 22:34:27浏览次数:47  
标签:Java Spring 适配器 模式 装饰 接口 设计模式 public

Java-Spring框架中用到的设计模式

  1. 单例模式(Singleton)

    Spring 中的 Bean 默认是单例的,容器中只存在一个实例。这有助于节省资源,提高性能。

  2. 工厂模式(Factory)

    Spring 使用工厂模式来创建和管理 Bean。通过配置文件或注解,Spring 容器可以根据需要创建相应的 Bean 对象。

  3. 代理模式(Proxy)

    Spring 使用代理模式来实现 AOP(面向切面编程)。AOP 将横切关注点(如日志、事务)与业务逻辑分离,通过代理来控制横切关注点的执行。

  4. 观察者模式(Observer)

    Spring 事件机制是基于观察者模式实现的。应用程序可以发布事件,而监听器可以订阅这些事件,并在事件发生时执行相应的操作。

  5. 模板方法模式(Template Method)

    Spring 的 JdbcTemplate 和 HibernateTemplate 等模板类使用了模板方法模式。在这些模板类中,定义了一套算法骨架,具体的步骤由子类实现。

  6. 策略模式(Strategy)

    Spring 的资源加载和资源解析等机制中使用了策略模式。不同的实现类对应不同的策略,根据需要选择不同的策略。

  7. 适配器模式(Adapter)

    Spring MVC 中的 HandlerAdapter 就是适配器模式的应用,它负责将处理器适配到框架中,使得可以处理不同类型的处理器。

    适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户期望的另一个接口。这种模式通常用于使已有的类在不修改其源代码的情况下与其他类协作。

    结构和角色:

    • 目标接口(Target): 定义客户端使用的接口,客户端通过目标接口调用适配器的方法。
    • 适配器(Adapter): 实现了目标接口,并包装了被适配者的对象,将客户端调用目标接口的请求转换为对被适配者的适当调用。
    • 被适配者(Adaptee): 已存在的类,具有客户端需要的功能,但其接口与目标接口不匹配。

    示例代码:

    假设有一个英文播报系统和一个中文播报系统,现在希望通过适配器,使得英文播报系统也能以中文的方式播报。

    // 目标接口
    interface Speaker {
        void speak();
    }
    
    // 被适配者
    class EnglishSpeaker {
        void speakInEnglish() {
            System.out.println("Speaking in English");
        }
    }
    
    // 适配器
    class EnglishAdapter implements Speaker {
        private EnglishSpeaker englishSpeaker;
    
        public EnglishAdapter(EnglishSpeaker englishSpeaker) {
            this.englishSpeaker = englishSpeaker;
        }
    
        @Override
        public void speak() {
            englishSpeaker.speakInEnglish();
        }
    }
    
    // 客户端代码
    public class AdapterPatternDemo {
        public static void main(String[] args) {
            EnglishSpeaker englishSpeaker = new EnglishSpeaker();
            Speaker adapter = new EnglishAdapter(englishSpeaker);
    
            // 调用适配器的接口,实际上会调用被适配者的方法
            adapter.speak();
        }
    }
    
    
  8. 装饰者模式(Decorator)

    Spring AOP 中的增强(Advice)就是一种装饰者模式的应用。增强可以在目标方法执行前、执行后等时机进行装饰。

    装饰者模式是一种结构型设计模式,允许向一个对象动态地添加功能,而无需通过继承来实现。这种模式是继承的一个替代方案。

    结构和角色:

    • 组件接口(Component): 定义了被装饰者和具体装饰者共同实现的接口。
    • 具体组件(ConcreteComponent): 实现了组件接口的具体类,是被装饰的原始对象。
    • 装饰者(Decorator): 包含一个指向组件对象的引用,并实现了组件接口。通常是一个抽象类。
    • 具体装饰者(ConcreteDecorator): 扩展了装饰者,向组件添加新的行为或状态。

    示例代码:

    假设有一个咖啡店,提供基础的咖啡和可以选择添加不同调料的装饰者。

    // 组件接口
    interface Coffee {
        double cost();
    }
    
    // 具体组件
    class SimpleCoffee implements Coffee {
        @Override
        public double cost() {
            return 5.0; // 基础咖啡的价格
        }
    }
    
    // 装饰者
    abstract class CoffeeDecorator implements Coffee {
        protected Coffee decoratedCoffee;
    
        public CoffeeDecorator(Coffee decoratedCoffee) {
            this.decoratedCoffee = decoratedCoffee;
        }
    
        @Override
        public double cost() {
            return decoratedCoffee.cost();
        }
    }
    
    // 具体装饰者
    class MilkDecorator extends CoffeeDecorator {
        public MilkDecorator(Coffee decoratedCoffee) {
            super(decoratedCoffee);
        }
    
        @Override
        public double cost() {
            return super.cost() + 2.0; // 添加牛奶的价格
        }
    }
    
    // 客户端代码
    public class DecoratorPatternDemo {
        public static void main(String[] args) {
            Coffee simpleCoffee = new SimpleCoffee();
            System.out.println("Cost of simple coffee: $" + simpleCoffee.cost());
    
            Coffee milkCoffee = new MilkDecorator(simpleCoffee);
            System.out.println("Cost of coffee with milk: $" + milkCoffee.cost());
        }
    }
    

    这个例子中,SimpleCoffee​ 是基础咖啡,MilkDecorator​ 是具体装饰者,用于向咖啡添加牛奶。客户端可以根据需要选择添加不同的调料。这种方式使得代码更加灵活,可以动态地组合对象。

标签:Java,Spring,适配器,模式,装饰,接口,设计模式,public
From: https://www.cnblogs.com/anhaoyang/p/design-mode-used-in-the-javaspring-framework-zmeupb.ht

相关文章

  • Java-聚簇索引和非聚簇索引
    Java-聚簇索引和非聚簇索引聚簇索引(ClusteredIndex)和非聚簇索引(Non-clusteredIndex)是数据库中两种不同的索引结构。聚簇索引(ClusteredIndex):定义:聚簇索引是按照索引的顺序直接排列数据表的行的一种索引结构。实际上,聚簇索引决定了数据表的物理排序方式。主键:通常,聚簇索......
  • java中%的含义,千万别弄反了!!!
    i%j代表的是i除以j的余数,比如5%2=1,千万别弄反了!!!因为敲代码时候弄反,导致结果出错/*题目:找出100以内所有素数/质数,10000以内的呢*/publicclassPrimeNumberTest{publicstaticvoidmain(String[]args){for(inti=1;i<=100;i++){booleanisFlag=tr......
  • 单例设计模式
    单例模式是一种常用的软件设计模式,其目标是确保一个类只有一个实例,并提供一个全局访问点。在C++中,可以通过以下步骤实现单例模式:私有化构造函数,以防止外界创建单例类的对象。使用类的私有静态指针变量指向类的唯一实例。使用一个公有的静态方法获取该实例。以下是一个简......
  • Java_2 判断语句
    1if语句1.1基本if-else语句当条件成立时,执行某些语句;否则执行另一些语句。importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);inta=sc.nextInt();if......
  • Java_1 变量、运算符、表达式、输入与输出
    1编写一个简单的Java程序–手速练习publicclassMain{publicstaticvoidmain(String[]args){System.out.println("HelloWorld");}}2语法基础2.1变量变量必须先定义,才可以使用。不能重名。变量定义的方式:publicclassMain{publicstat......
  • 南昌航空大学JAVA Blog-3
    一.前言这一次博客将主要介绍在第7、8次PTA作业和期末考试中涉及到的知识点。(1)题目集7: 7-1容器-HashMap-检索7-2容器-HashMap-排序7-3课程成绩统计程序-27-4动物发声模拟器(多态)这几道题目中只有课程成绩统计程序-2难度较大,其他的三道题目考察的都是较为基础的内容,代码量......
  • Springboot内置神器:CollectionUtils工具类的实战秘籍
    前言实际业务开发中,集合的判断和操作也是经常用到的,Spring也针对集合的判断和操作封装了一些方法,但是最令我惊讶的是,我在梳理这些内容的过程中发现了一些有趣的现象,我的第一反应是不敢相信,再想一想,没错,我是对的。所以强烈建议大家可以认真看完这篇文章,这一篇绝对有价值,因为有趣的......
  • java IO流
    I:input,输入流,从磁盘文件读数据到内存O:Output,输出流,从内存写数据到磁盘文件1.IO流分类字节流:最小读取单位为字节,更适合读音视频文件字符流:最小读取单位为字符,更适合读文本内容2.文件字节输入流(1).每次读取一个字节缺点:效率低每次只能读一个字节且不......
  • #yyds干货盘点#Java面试题
    1.如何理解面向对象和面向过程【面向过程】:完成某件事的过程,性能高于【面向对象】优点:但是因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展【面向对象】:把要完......
  • 失物招领平台|基于Springboot和Vue实现失物招领系统
    作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师主要内容:Java项目开发、Python项目开发、大学数据和AI项目开发、单片机项目设计、面试技术整理、最新技术分享收藏点赞不迷路 关注作者有好处文末获得源码 项目编号:BS-XX-194一,环境介绍语言环境:Java: jdk1.8数据库:My......