前言
好记性不如烂笔头。
问题:
现在有一个数字与字母的映射表,且有以下规则:
映射表:
数字 字母
3 A
7 B
9 C
规则:
1.碰到当前数字时,使用字母替换,例如,3-> A
2.碰到当前数字的倍数时,使用字母替换, 例如:6->A
3.碰到多个数字的倍数时,使用多个对应的字母替代,例如:15 -> AB,21->AC
请根据映射表和规则,给出0-100之间的转换结果,提示:不要直接在for循环中使用if判断,尽可能的使用设计模式。
解决方法:策略模式
策略模式(Strategy Pattern)
是一种行为设计模式,它使你能够在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象更改 context 对象的执行算法。
策略模式通常涉及三个角色:
Context(上下文):这个类用一个 Strategy(策略)对象来配置其行为。Context 维护一个对 Strategy 对象的引用,可调用其接口来执行所需策略。
Strategy(策略):这是一个接口或抽象类,定义了所有支持的算法的公共接口。Context 使用这个接口来调用具体的策略实现。
ConcreteStrategy(具体策略):实现了 Strategy 接口的具体类。每个具体策略类都提供了不同的算法或行为。
代码实例:
一、定义策略接口
java
package com.service;
/**
*@Description 定义策略接口
*@Author yingluo
*@Date 2024-2-23
**/
public interface NumberToLetterStrategy {
public String convert(int number);
}
二、各个数字实现类
java
package com.service.impl;
import com.service.NumberToLetterStrategy;
/**
* Description: 数字3的映射规则创建实现类
* Author:yingluo
* Date:2024/2/23
**/
public class ThreeStrategy implements NumberToLetterStrategy {
@Override
public String convert(int number) {
if(number == 3 || number % 3 == 0){
return "A";
}
return "";
}
}
java
package com.service.impl;
import com.service.NumberToLetterStrategy;
/**
* Description: 数字7的映射规则创建实现类
* Author:yingluo
* Date:2024/2/23
**/
public class SevenStrategy implements NumberToLetterStrategy {
@Override
public String convert(int number) {
if(number == 7 || number % 7 == 0){
return "B";
}
return "";
}
}
java
package com.service.impl;
import com.service.NumberToLetterStrategy;
/**
* Description: 数字9的映射规则创建实现类
* Author:yingluo
* Date:2024/2/23
**/
public class NineStrategy implements NumberToLetterStrategy {
@Override
public String convert(int number) {
if(number == 9 || number % 9 == 0){
return "C";
}
return "";
}
}
三、使用策略对象来执行映射
java
package com.control;
import com.service.NumberToLetterStrategy;
import com.service.impl.NineStrategy;
import com.service.impl.SevenStrategy;
import com.service.impl.ThreeStrategy;
import java.util.HashMap;
import java.util.Map;
/**
* Description: 使用策略对象来执行映射
* Author:yingluo
* Date:2024/2/23
**/
public class NumberToLetterContext {
private Map<Integer, NumberToLetterStrategy> strategies;
public NumberToLetterContext(){
strategies = new HashMap<>();
strategies.put(3, new ThreeStrategy());
strategies.put(7, new SevenStrategy());
strategies.put(9, new NineStrategy());
}
public String convert(int number){
StringBuffer result = new StringBuffer();
for (NumberToLetterStrategy strategy : strategies.values()){
result.append(strategy.convert(number));
}
return result.toString();
}
}
四、测试类
java
package com;
import com.control.NumberToLetterContext;
/**
* Description: main方法测试类
* Author:yingluo
* Date:2024/2/23
**/
public class Test {
public static void main(String[] args) {
NumberToLetterContext context = new NumberToLetterContext();
for (int i=0 ; i<=100 ; i++){
System.out.println(i+"->"+context.convert(i));
}
}
}