[设计模式] 策略模式实现处理不同种地址字符串

Posted 一杯糖不加咖啡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[设计模式] 策略模式实现处理不同种地址字符串相关的知识,希望对你有一定的参考价值。

一、需求场景

验证两种地址符串是不是一个地址

二、策略模式(参考菜鸟教程

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

三、应用实例

Strategy:创建一个接口。

public interface Strategy 

    /**
     * 处理地址字符串
     * */
    void handleAddressStr(NlpVerifyDTO nlpVerifyDTO);


OriginalAddress:创建实现接口的实体类。地址字符串A的处理方法

public class OriginalAddress implements Strategy 
    @Override
    public void handleAddressStr(NlpVerifyDTO nlpVerifyDTO) 
        StringBuilder res = new StringBuilder(nlpVerifyDTO.getAddress());
        if (!res.toString().contains(GlobalVar.STRING_BEIJINGSHI)) 
            res.insert(0, GlobalVar.STRING_BEIJINGSHI);
        
        if (res.toString().split(GlobalVar.STRING_DISTRICT).length == 1) 
            res.insert(3, nlpVerifyDTO.getAreaName());
        
        if (res.toString().split(GlobalVar.STRING_VILLAGE).length == 1) 
            res.insert(res.indexOf("区") + 1, nlpVerifyDTO.getStreetName());
        
        nlpVerifyDTO.setAddressForBDM(res.toString());
    


ContextStrategy:创建实现接口的实体类。地址字符串B的处理方法

@AllArgsConstructor
public class ContextStrategy 

    private Strategy strategy;

    /**
     * 调用方直接调用该函数即可实现选择策略
     * */
    public void handleAddressStr(NlpVerifyDTO nlpVerifyDTO) 
        strategy.handleAddressStr(nlpVerifyDTO);
    


ContextStrategy:创建 Context 类。

@AllArgsConstructor
public class ContextStrategy 

    private Strategy strategy;

    /**
     * 调用方直接调用该函数即可实现选择策略
     * */
    public void handleAddressStr(NlpVerifyDTO nlpVerifyDTO) 
        strategy.handleAddressStr(nlpVerifyDTO);
    



程序入口

@Override
public List<NlpVerifyDTO> getNlpDate(BaseRequest request) 
    // 地址A拼装向百度地图发起请求的地址使用策略
    ContextStrategy originalAddressStrategy = new ContextStrategy(new OriginalAddress());
    // 地址B拼装向百度地图发起请求的地址使用策略
    ContextStrategy eIBAddressStrategy = new ContextStrategy(new EIBAddress());
    List<NlpVerifyDTO> nlpVerifyRawDataList = socNlpMessageMapper.getNlpDataOrign(request);
    nlpVerifyRawDataList.forEach(e -> 
        // 处理地址字符串A
        originalAddressStrategy.handleAddressStr(e);
        // 处理地址字符串B
        eIBAddressStrategy.handleAddressStr(e);
    );
    return nlpVerifyRawDataList;

以上是关于[设计模式] 策略模式实现处理不同种地址字符串的主要内容,如果未能解决你的问题,请参考以下文章

简化理解:策略设计模式

WCF中的几种地址总结

策略模式

设计模式(15)-----策略设计模式

Java 实现策略(Strategy)模式

代码片-策略模式+工厂模式