文章目录
1.策略模式
1.目录结构

2.Strategy.java 策略接口
java
package com.sunxiansheng.design_pattern.strategy;
/**
* Description: 策略接口
*
* @Author sun
* @Create 2025/2/7 12:17
* @Version 1.0
*/
public interface Strategy {
/**
* 算法接口
*/
void algorithmInterface();
}
3.StrategyA.java 策略A
java
package com.sunxiansheng.design_pattern.strategy;
/**
* Description: 策略A
*
* @Author sun
* @Create 2024/8/12 20:05
* @Version 1.0
*/
public class StrategyA implements Strategy{
@Override
public void algorithmInterface() {
System.out.println("策略A");
}
}
4.StrategyB.java 策略B
java
package com.sunxiansheng.design_pattern.strategy;
/**
* Description: 策略B
*
* @Author sun
* @Create 2024/8/12 20:05
* @Version 1.0
*/
public class StrategyB implements Strategy{
@Override
public void algorithmInterface() {
System.out.println("策略B");
}
}
5.StrategyC.java 策略C
java
package com.sunxiansheng.design_pattern.strategy;
/**
* Description: 策略C
*
* @Author sun
* @Create 2024/8/12 20:05
* @Version 1.0
*/
public class StrategyC implements Strategy{
@Override
public void algorithmInterface() {
System.out.println("策略C");
}
}
6.Context.java 策略上下文
java
package com.sunxiansheng.design_pattern.strategy;
/**
* Description: 策略上下文,根据不同的策略执行不同的算法
*
* @Author sun
* @Create 2025/2/7 12:17
* @Version 1.0
*/
public class Context {
/**
* 策略的属性
*/
private Strategy strategy;
/**
* 在创建对象的时候就指定不同的策略
* @param type
*/
public Context(int type) {
switch (type) {
case 1:
strategy = new StrategyA();
break;
case 2:
strategy = new StrategyB();
break;
case 3:
strategy = new StrategyC();
break;
default:
break;
}
}
/**
* 调用具体的算法
*/
public void contextInterface() {
strategy.algorithmInterface();
}
}
7.Client.java 客户端
java
package com.sunxiansheng.design_pattern.strategy;
/**
* Description: 客户端
*
* @Author sun
* @Create 2025/2/7 12:19
* @Version 1.0
*/
public class Client {
public static void main(String[] args) {
// 策略工厂中定义具体的策略
Context context = new Context(1);
// 调用方法时,就会指定具体的策略
context.contextInterface();
}
}
8.小结
策略模式,首先要定义一个策略接口,然后每个具体的策略都要去实现这个策略接口,接下来就要有一个上下文,这个上下文可以根据不同的类型来设置不同的策略。
2.适配器模式
1.目录结构

2.CustomPaymentProcessor.java 自己的支付接口
java
package com.sunxiansheng.design_pattern.adapter;
/**
* Description: 自定义的支付接口
*
* @Author sun
* @Create 2025/2/9 11:05
* @Version 1.0
*/
public interface CustomPaymentProcessor {
void processPayment(double amount);
}
3.PayPalPaymentService.java 第三方的支付服务
java
package com.sunxiansheng.design_pattern.adapter;
/**
* Description: 第三方支付服务(需要适配的接口)
*
* @Author sun
* @Create 2025/2/9 11:06
* @Version 1.0
*/
public class PayPalPaymentService {
public void makePayment(double amountInDollars) {
System.out.println("Payment made using PayPal: $" + amountInDollars);
}
}
4.PayPalPaymentAdapter.java 第三方适配器
java
package com.sunxiansheng.design_pattern.adapter;
/**
* Description: 适配器类,用来将第三方的PayPal支付接口适配到系统自定义的支付接口上
*
* @Author sun
* @Create 2025/2/9 11:07
* @Version 1.0
*/
public class PayPalPaymentAdapter implements CustomPaymentProcessor {
/**
* 注入第三方接口
*/
private PayPalPaymentService payPalPaymentService;
public PayPalPaymentAdapter(PayPalPaymentService payPalPaymentService) {
this.payPalPaymentService = payPalPaymentService;
}
/**
* 将第三方接口适配,使其满足自己接口的要求
*
* @param amount
*/
@Override
public void processPayment(double amount) {
System.out.println("适配过的接口");
payPalPaymentService.makePayment(amount);
}
}
5.Client.java 客户端
java
package com.sunxiansheng.design_pattern.adapter;
/**
* Description: 客户端
*
* @Author sun
* @Create 2025/2/9 11:08
* @Version 1.0
*/
public class Client {
public static void main(String[] args) {
// 第三方的支付Service
PayPalPaymentService payPalPaymentService = new PayPalPaymentService();
// 自己的适配器聚合第三方支付
PayPalPaymentAdapter payPalPaymentAdapter = new PayPalPaymentAdapter(payPalPaymentService);
// 使用适配器调用方法
payPalPaymentAdapter.processPayment(100.0);
}
}
6.小结
适配器模式其实就是自己有一个接口,然后第三方有一个服务,就需要一个适配器,这个适配器就需要实现自己的接口,然后聚合第三方的接口,来完成自己接口的对应功能。