【八股学习】设计模式

本文将介绍几种常用于项目中的设计模式和SpringBoot使用到的设计模式

行为模式

策略模式

将不同的算法封装在独立的类中,并且抽取出一个独立的接口来约束其策略,使得他们之间可以相互替换。
需要用到的类/接口如下:
1、Strategy 接口,里面定义一个策略应该实现的方法

public interface DiscountStrategy {
    // 计算折扣额度:
    BigDecimal getDiscount(BigDecimal total);
}

2、Strategy 实现类,实现Strategy 接口中的所有方法,可以定义多个不同的策略供选择

public class UserDiscountStrategy implements DiscountStrategy {
    public BigDecimal getDiscount(BigDecimal total) {
        // 普通会员打九折:
        return total.multiply(new BigDecimal("0.1")).setScale(2, RoundingMode.DOWN);
    }
}

public class OverDiscountStrategy implements DiscountStrategy {
    public BigDecimal getDiscount(BigDecimal total) {
        // 满100减20优惠:
        return total.compareTo(BigDecimal.valueOf(100)) >= 0 ? BigDecimal.valueOf(20) : BigDecimal.ZERO;
    }
}

3、Context 类,可以持有某一个策略,或者指定一个默认策略

DiscountContext ctx = new DiscountContext();

```java
public class DiscountContext {
    // 持有某个策略:
    private DiscountStrategy strategy = new UserDiscountStrategy();

    // 允许客户端设置新策略:
    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public BigDecimal calculatePrice(BigDecimal total) {
        return total.subtract(this.strategy.getDiscount(total)).setScale(2);
    }
}

4、调用方式:

// 默认使用普通会员折扣:
BigDecimal pay1 = ctx.calculatePrice(BigDecimal.valueOf(105));
System.out.println(pay1);

// 使用满减折扣:
ctx.setStrategy(new OverDiscountStrategy());
BigDecimal pay2 = ctx.calculatePrice(BigDecimal.valueOf(105));
System.out.println(pay2);

// 使用Prime会员折扣:
ctx.setStrategy(new PrimeDiscountStrategy());
BigDecimal pay3 = ctx.calculatePrice(BigDecimal.valueOf(105));
System.out.println(pay3);

模版方法

定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现,这样不同的子类就可以定义出不同的步骤。

Spring中很多以Template结尾的对数据库操作的类,都使用到了模版方法

需要使用的类如下:
1、一个抽象的模板方法,定义好了主要的执行流程,但是流程中部分方法的具体实现并没有被实现、并且可以有不同的实现:
为了让子方法可以更改,我们需要将待实现方法抽象,自然也就要将方法变成抽象方法

public abstract class AbstractSetting {
    public final String getSetting(String key) {
        String value = lookupCache(key);
        if (value == null) {
            value = readFromDatabase(key);
            putIntoCache(key, value);
        }
        return value;
    }

    protected abstract String lookupCache(String key);

    protected abstract void putIntoCache(String key, String value);
}

2、继承抽象类的子类,进行抽象方法的具体实现,不关心具体的流程,只关心方法实现

// 我们希望用一个Map做缓存,那么可以写一个LocalSetting
public class LocalSetting extends AbstractSetting {
    private Map<String, String> cache = new HashMap<>();

    protected String lookupCache(String key) {
        return cache.get(key);
    }

    protected void putIntoCache(String key, String value) {
        cache.put(key, value);
    }
}

3、调用方法:

AbstractSetting setting1 = new LocalSetting();
System.out.println("test = " + setting1.getSetting("test"));
System.out.println("test = " + setting1.getSetting("test"));

观察者模式

观察者模式(Observer)又称发布-订阅模式(Publish-Subscribe:Pub/Sub)。它是一种通知机制,让发送通知的一方(被观察方)和接收通知的一方(观察者)能彼此分离,互不影响。

观察者模式就是要分离被观察者和观察者之间的耦合关系,因为发送消息的人不想知道接受消息的人具体是谁。

这里我们介绍 Spring 事件驱动模型中的角色:
1、事件角色
ApplicationEvent (org.springframework.context包下)充当事件的角色,这是一个抽象类。

2、事件监听者对象
ApplicationListener 充当了事件监听者角色,它是一个接口,里面只定义了一个 onApplicationEvent()方法来处理ApplicationEvent

package org.springframework.context;
import java.util.EventListener;
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E var1);
}

3、事件发布者角色
ApplicationEventPublisher 充当了事件的发布者,它也是一个接口。

@FunctionalInterface
public interface ApplicationEventPublisher {
    default void publishEvent(ApplicationEvent event) {
        this.publishEvent((Object)event);
    }

    void publishEvent(Object var1);
}
### 深度学习中的卷积神经网络基础 #### 卷积神经网络(CNN)原理 卷积神经网络是一种专门用于处理具有网格状拓扑数据的前馈神经网络,最常应用于图像识别和分类任务。其核心思想在于通过局部感知野和权值共享来减少计算复杂度并提取空间特征[^1]。 - **卷积层**:这是 CNN 的基本构建模块之一,负责从输入数据中提取特征。卷积操作通过对输入矩阵应用一组可学习的滤波器实现,这些滤波器可以检测边缘、纹理或其他视觉模式。 - **池化层**:通常紧跟在卷积层之后,用于降低特征图的空间维度,从而减少参数数量和计算量。常用的池化方式包括最大池化和平均池化[^2]。 - **全连接层**:位于网络的最后一部分,将前面提取到的高维特征映射到类别标签上。这一层的作用类似于传统神经网络的功能。 - **激活函数**:ReLU 是目前广泛使用的非线性激活函数,它能够有效缓解梯度消失问题,并加速收敛过程[^3]。 #### 常见的应用场景 卷积神经网络因其强大的特征提取能力,在多个领域得到了广泛应用: - 图像分类与目标检测:如 AlexNet, VGG, ResNet 等经典架构均基于 CNN 设计而成; - 自然语言处理:尽管 RNN 和 Transformer 更为主流,但在某些特定任务中仍可见到 CNN 的身影; - 医疗影像分析:利用 CNN 对 X 光片、MRI 扫描结果进行疾病诊断等[^4]; #### 面试可能涉及的经典题目 以下是围绕卷积神经网络的一些典型面试考察点及其解答思路: 1. **什么是感受野?如何增大它的范围而不增加额外开销** - 受感野定义为单个像素位置处所覆盖的实际区域大小。可以通过堆叠更多层数或者采用膨胀卷积技术间接扩大受感野而无需显著提升资源消耗。 2. **解释一下 Inception 结构的设计理念是什么样的?** - Google 提出的 Inception Module 主要目的是探索最优尺度组合的同时保持高效运算效率。具体做法是在同一层内部平行设置多种尺寸核大小的操作选项供选择使用。 3. **Batch Normalization 起到了哪些作用呢 ?** - BN 技术不仅可以加快训练速度还能起到一定正则效果防止过拟合现象发生 。另外也有助于缓解 Internal Covariate Shift 问题改善优化性能表现. ```python import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=(3, 3)) self.pooling_layer = nn.MaxPool2d(kernel_size=(2, 2), stride=2) self.fc_layer = nn.Linear(64 * (image_height//2) * (image_width//2), num_classes) def forward(self, x): x = self.conv_layer(x) x = nn.functional.relu(x) x = self.pooling_layer(x) x = x.view(-1, 64 * (image_height//2) * (image_width//2)) # Flatten the tensor output = self.fc_layer(x) return output ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值