java基础学习笔记

1.语法篇

循环

正则表达式

数据类型

泛型

数据类型

String

indexof

静态概念

静态代码块

以下代码是使用静态代码块初始化map集合

package com.ztesoft.crmpub.bpm.task.action;

import com.ztesoft.crmpub.bpm.consts.MsgConsts;
import java.util.HashMap;
import java.util.Map;

/**
 * 任务工单动作工厂类
 *
 * <p>该工厂类用于根据消息动作类型创建对应的工单动作实例。</p>
 *
 * @author major
 */
public class youhua {

    // 定义动作与工单动作的映射
    private static final Map<String, IWorkOrderAction> actionMap = new HashMap<>();

    // 静态代码块用于初始化动作映射
    static {
        actionMap.put(MsgConsts.ACTION_WO_NEW, new WorkOrderNewAction());
        actionMap.put(MsgConsts.ACTION_WO_DISPATCH, new WorkOrderDispatchAction());
        actionMap.put(MsgConsts.ACTION_WO_FINISH, new WorkOrderFinishAction());
        actionMap.put(MsgConsts.ACTION_WO_FAIL, new WorkOrderFailAction());
        actionMap.put(MsgConsts.ACTION_WO_WITHDRAW, new WorkOrderWithdrawAction());
        actionMap.put(MsgConsts.ACTION_WO_PULL_BACK, new WorkOrderPullBackAction());
    }

    /**
     * 获取工单动作实例
     *
     * @param msgAction 消息动作类型
     * @return 对应的工单动作实例
     * @throws IllegalArgumentException 如果消息动作类型无效
     */
    public static IWorkOrderAction getWorkOrderAction(String msgAction) {
        IWorkOrderAction workOrderAction = actionMap.get(msgAction);
        if (workOrderAction == null) {
            throw new IllegalArgumentException("Invalid msgAction: " + msgAction);
        }
        return workOrderAction;
    }
}

2.api

3.集合

Map要通过entryset或者keyset或者values获取map的条目流

3.IO流

4.并发编程

反射

关键词


5.面向对象

接口和接口直接用extend继承

2.注意事项

3.语法技巧

静态导入

在 Java 中,你可以通过静态导入(static import)来直接使用另一个类中的静态方法,而无需实例化那个类。这可以使代码更加简洁和易读,特别是在频繁使用某些静态方法时。

设计模式

 单例模式

如何使用

在Java Spring Boot中,单例模式的一个经典应用场景是配置管理类。假设我们需要管理应用的配置信息,并确保这些配置在应用中只有一个实例可用。以下是一个使用单例模式的简单示例:

私有构造方法使得只能有一个实例

package com.example.demo.config;

import org.springframework.stereotype.Component;

@Component
public class AppConfig {

    // 模拟配置属性
    private String appName = "MySpringBootApp";
    private String version = "1.0.0";

    // 私有构造方法,防止外部实例化
    private AppConfig() {}

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}

在这个例子中,AppConfig 是一个单例类,它的构造方法是私有的,这样可以防止外部直接实例化它。我们使用 @Component 注解将这个类标记为 Spring 管理的 bean。

在Spring Boot中使用单例模式

Spring Boot 默认会将所有用 @Component@Service@Repository 等注解的类注册为单例(除非特别指定为原型模式)。因此,当我们在其他类中注入 AppConfig 时,Spring 会确保每次注入的都是同一个实例。

例如,创建一个控制器类来使用 AppConfig

package com.example.demo.controller;

import com.example.demo.config.AppConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigController {

    @Autowired
    private AppConfig appConfig;

    @GetMapping("/config")
    public String getConfig() {
        return "App Name: " + appConfig.getAppName() + ", Version: " + appConfig.getVersion();
    }
}

在这个 ConfigController 类中,我们通过 @Autowired 注入了 AppConfig,并在 /config 端点返回配置值。Spring 会自动确保 AppConfig 是单例的,因此所有访问此端点的请求将共享相同的 AppConfig 实例。

模板模式

很多依赖库的设计中经常会用到模板模式 如JdbcTemplate

 

策略模式

支付处理中  会有多种不同的支付方式(策略)

工厂模式

1. 简单工厂模式(Simple Factory Pattern)

场景:在一个 Web 应用中,我们可能需要根据用户的请求来处理不同类型的消息(如文本消息、图片消息)。我们可以创建一个简单工厂来生成不同的消息处理器。

// 消息接口
public interface MessageHandler {
    void handleMessage(String message);
}

// 具体消息处理类
@Service("textMessageHandler")
public class TextMessageHandler implements MessageHandler {
    @Override
    public void handleMessage(String message) {
        System.out.println("Handling text message: " + message);
    }
}

@Service("imageMessageHandler")
public class ImageMessageHandler implements MessageHandler {
    @Override
    public void handleMessage(String message) {
        System.out.println("Handling image message: " + message);
    }
}

// 简单工厂类
@Component
public class MessageHandlerFactory {

    @Autowired
    private ApplicationContext applicationContext;

    public MessageHandler getHandler(String type) {
        return (MessageHandler) applicationContext.getBean(type + "MessageHandler");
    }
}

// 控制器类
@RestController
@RequestMapping("/messages")
public class MessageController {

    @Autowired
    private MessageHandlerFactory handlerFactory;

    @PostMapping
    public ResponseEntity<String> processMessage(@RequestParam String type, @RequestParam String message) {
        MessageHandler handler = handlerFactory.getHandler(type);
        handler.handleMessage(message);
        return ResponseEntity.ok("Message processed");
    }
}

2. 工厂方法模式(Factory Method Pattern)

场景:在一个 Web 应用中,我们可能需要创建不同类型的服务(如用户服务和订单服务),每种服务有不同的实现。我们可以使用工厂方法模式来创建这些服务。

// 服务接口
public interface Service {
    void execute();
}

// 具体服务类
@Service
public class UserService implements Service {
    @Override
    public void execute() {
        System.out.println("Executing User Service");
    }
}

@Service
public class OrderService implements Service {
    @Override
    public void execute() {
        System.out.println("Executing Order Service");
    }
}

// 工厂接口
public interface ServiceFactory {
    Service createService();
}

// 具体工厂类
@Component
public class UserServiceFactory implements ServiceFactory {
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public Service createService() {
        return applicationContext.getBean(UserService.class);
    }
}

@Component
public class OrderServiceFactory implements ServiceFactory {
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public Service createService() {
        return applicationContext.getBean(OrderService.class);
    }
}

// 控制器类
@RestController
@RequestMapping("/services")
public class ServiceController {

    @Autowired
    private ServiceFactory userServiceFactory;

    @Autowired
    private ServiceFactory orderServiceFactory;

    @GetMapping("/user")
    public ResponseEntity<String> executeUserService() {
        Service service = userServiceFactory.createService();
        service.execute();
        return ResponseEntity.ok("User Service executed");
    }

    @GetMapping("/order")
    public ResponseEntity<String> executeOrderService() {
        Service service = orderServiceFactory.createService();
        service.execute();
        return ResponseEntity.ok("Order Service executed");
    }
}

3. 抽象工厂模式(Abstract Factory Pattern)

场景:在一个 Web 应用中,我们可能需要创建不同风格的用户界面组件(如现代风格和经典风格的按钮和文本框)。我们可以使用抽象工厂模式来创建这些组件。

// 组件接口
public interface Button {
    void render();
}

public interface TextBox {
    void render();
}

// 具体组件类
@Service("modernButton")
public class ModernButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering Modern Button");
    }
}

@Service("classicButton")
public class ClassicButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering Classic Button");
    }
}

@Service("modernTextBox")
public class ModernTextBox implements TextBox {
    @Override
    public void render() {
        System.out.println("Rendering Modern TextBox");
    }
}

@Service("classicTextBox")
public class ClassicTextBox implements TextBox {
    @Override
    public void render() {
        System.out.println("Rendering Classic TextBox");
    }
}

// 抽象工厂接口
public interface UIComponentFactory {
    Button createButton();
    TextBox createTextBox();
}

// 具体工厂类
@Component
public class ModernUIFactory implements UIComponentFactory {
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public Button createButton() {
        return applicationContext.getBean("modernButton", Button.class);
    }

    @Override
    public TextBox createTextBox() {
        return applicationContext.getBean("modernTextBox", TextBox.class);
    }
}

@Component
public class ClassicUIFactory implements UIComponentFactory {
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public Button createButton() {
        return applicationContext.getBean("classicButton", Button.class);
    }

    @Override
    public TextBox createTextBox() {
        return applicationContext.getBean("classicTextBox", TextBox.class);
    }
}

// 控制器类
@RestController
@RequestMapping("/ui")
public class UIController {

    @Autowired
    private UIComponentFactory modernUIFactory;

    @Autowired
    private UIComponentFactory classicUIFactory;

    @GetMapping("/modern")
    public ResponseEntity<String> renderModernUI() {
        Button button = modernUIFactory.createButton();
        TextBox textBox = modernUIFactory.createTextBox();
        button.render();
        textBox.render();
        return ResponseEntity.ok("Modern UI rendered");
    }

    @GetMapping("/classic")
    public ResponseEntity<String> renderClassicUI() {
        Button button = classicUIFactory.createButton();
        TextBox textBox = classicUIFactory.createTextBox();
        button.render();
        textBox.render();
        return ResponseEntity.ok("Classic UI rendered");
    }
}

4.总结

  • 简单工厂模式用于根据请求类型创建不同的消息处理器。
  • 工厂方法模式用于创建不同类型的服务,每种服务由一个具体工厂类创建。
  • 抽象工厂模式用于创建一系列相关的用户界面组件(按钮和文本框),不同风格的组件由不同的工厂类创建。

适配器模式

场景

假设你有一个旧的服务 LegacyPaymentService,它提供了处理支付的方法,但你希望将它适配到一个新的支付接口 PaymentService,以便在你的应用中使用新接口。

1. 旧服务接口和实现

LegacyPaymentService.java
package com.example.legacy;

// 旧服务接口
public interface LegacyPaymentService {
    // 处理旧支付接口的方法
    String processLegacyPayment(double amount);
}

LegacyPaymentServiceImpl.java

package com.example.legacy;

import org.springframework.stereotype.Service;

// 旧服务的具体实现
@Service
public class LegacyPaymentServiceImpl implements LegacyPaymentService {

    @Override
    public String processLegacyPayment(double amount) {
        // 实际处理支付的逻辑
        return "Processed payment of $" + amount + " with Legacy Payment Service.";
    }
}

2. 新服务接口

PaymentService.java
package com.example.new;

// 新服务接口
public interface PaymentService {
    // 处理支付的方法
    String processPayment(double amount);
}

3. 适配器类

PaymentServiceAdapter.java
package com.example.adapter;

import com.example.legacy.LegacyPaymentService;
import com.example.new.PaymentService;
import org.springframework.stereotype.Component;

// 适配器类,实现新服务接口,并委托旧服务处理逻辑
@Component
public class PaymentServiceAdapter implements PaymentService {

    private final LegacyPaymentService legacyPaymentService;

    // 构造函数注入旧服务
    public PaymentServiceAdapter(LegacyPaymentService legacyPaymentService) {
        this.legacyPaymentService = legacyPaymentService;
    }

    @Override
    public String processPayment(double amount) {
        // 调用旧服务的方法进行处理
        return legacyPaymentService.processLegacyPayment(amount);
    }
}

4. 控制器

PaymentController.java
package com.example.controller;

import com.example.new.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

// 控制器,处理客户端的 HTTP 请求
@RestController
public class PaymentController {

    private final PaymentService paymentService;

    // 构造函数注入新服务(实际上是适配器)
    @Autowired
    public PaymentController(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    // 处理 GET 请求,调用新服务的方法
    @GetMapping("/process-payment")
    public String processPayment(@RequestParam double amount) {
        // 使用新服务接口处理支付请求
        return paymentService.processPayment(amount);
    }
}

注释解释

  • 旧服务接口 (LegacyPaymentService):定义了旧系统中现有的接口。
  • 旧服务实现 (LegacyPaymentServiceImpl):实现了旧接口的方法,包含实际的业务逻辑。
  • 新服务接口 (PaymentService):定义了新的服务接口,期望提供的支付处理方法。
  • 适配器 (PaymentServiceAdapter):将旧服务接口适配为新服务接口,内部调用旧服务的实现。
  • 控制器 (PaymentController):处理 HTTP 请求,使用新服务接口(实际上是适配器)来处理支付请求。

为什么要有适配器模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值