1. 程式人生 > >設計模式----策略模式(函數語言程式設計實現)

設計模式----策略模式(函數語言程式設計實現)

策略模式

策略模式可以分為三個部分:

  1. 策略模式的演算法介面
  2. 策略模式的實現類–具體的那種演算法
  3. 呼叫者 在這裡插入圖片描述

普通方式實現策略模式:

演算法介面:

package com.tangbaobao.java8.designer;

/**
 * @author tangxuejun
 * @version 2018/9/26 12:25 PM
 */
public interface ValidateStrategy {
    boolean execute(String s);
}

實現類:

實現類1:

package com.tangbaobao.java8.designer;

/**
 * @author tangxuejun
 * @version 2018/9/26 12:30 PM
 */
public class IsAllowLowerCase implements ValidateStrategy{ @Override public boolean execute(String s) { return s.matches("[a-z]+"); } }

實現類2:

package com.tangbaobao.java8.designer;

/**
 * @author tangxuejun
 * @version 2018/9/26 12:32 PM
 */
public class IsNumeric implements ValidateStrategy
{ @Override public boolean execute(String s) { return s.matches("\\d+"); } }

對外介面:

package com.tangbaobao.java8.designer;


/**
 * @author tangxuejun
 * @version 2018/9/26 12:33 PM
 */
public class Validatator {
    private ValidateStrategy validateStrategy;
    //注入策略介面
    public Validatator
(ValidateStrategy validateStrategy) { this.validateStrategy = validateStrategy; } /** * 呼叫介面 * * @param s * @return */ public boolean validate(String s) { return validateStrategy.execute(s); } }

呼叫:

  @Test
    public void testNormalStrategy() {
        //判斷是否是數字
        Validatator validatator = new Validatator(new IsNumeric());
        System.out.println(validatator.validate("79834"));

        //判斷是否是小寫字母
        Validatator validatator1 = new Validatator(new IsAllowLowerCase());
        System.out.println(validatator1.validate("kfdfj"));
    }

缺點:

在上述程式碼中,給Validator傳遞的演算法實現類介面每次都是一個新的,當新增一個業務的時候都要去寫一個演算法介面的實現類,抽象看來,其實Validatator(new IsNumeric());只是傳遞的一種行為,告訴介面來校驗是否是數字。

改進(新增一個校驗是否是大寫字母的演算法)

可以用匿名內部類來實現,不用每次新增類:


        Validatator validatator2 = new Validatator(new ValidateStrategy() {
            @Override
            public boolean execute(String s) {
                return s.matches("[A-Z]+");
            }
        });
        System.out.println(validatator2.validate("HK"));

用java中提供的函數語言程式設計來改進

 @Test
    public void testStrategy() {
        //校驗是否是小寫
        Validatator validatator = new Validatator(s -> s.matches("[a-z]+"));
        System.out.println(validatator.validate("dkfhd"));

        //校驗是否是數字
        Validatator validatatorNum = new Validatator(s -> s.matches("\\d+"));
        System.out.println(validatatorNum.validate("4394"));

    }

將行為直接傳遞給介面