searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Java策略模式

2024-06-12 08:11:32
11
0

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

概念

策略模式的主要思想是定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换,让算法的变化独立于使用它的客户。

策略模式涉及到三个角色:

  1. Context(环境类):维护一个策略类的引用,负责与具体的策略类交互。
  2. Strategy(抽象策略类):定义所有支持的算法的公共接口。通常是一个接口或者抽象类,所有具体策略类需要实现这个公共接口。
  3. ConcreteStrategy(具体策略类):实现具体的算法

策略模式类图:

现在以数学中加减乘除来设计策略模式:

// 策略接口
public interface Strategy {
    public int doOperation(int num1, int num2);
}

// 具体策略类
//加法
public class MathOperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

//减法
public class MathOperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}
//乘法
public class MathOperationMultiply implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}
//除法
public class MathOperationDivision implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 / num2;
    }
}

// 上下文类
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2){
        return strategy.doOperation(num1, num2);
    }
}

那如何使用策略模式?

public class Test {
    public static void main(String[] args) {
        Context context = new Context(new MathOperationAdd());    
        System.out.println("3+ 2 = " + context.executeStrategy(3, 2));

        context = new Context(new MathOperationSubtract());    
        System.out.println("3 - 2 = " + context.executeStrategy(3, 2));

        context = new Context(new MathOperationMultiply());    
        System.out.println("3 * 2 = " + context.executeStrategy(3, 2));

        context = new Context(new MathOperationDivision());    
        System.out.println("4 / 2 = " + context.executeStrategy(4, 2));
    }
}

使用策略模式的优点:

  1. 提高了代码的复用性和可维护性,将算法的定义与其具体实现进行解耦。
  2. 可以在运行时动态替换算法,提高了程序的灵活性。
  3. 符合开闭原则,新增算法无需修改现有代码。

缺点:

  1. 客户端必须知道策略的存在:客户端需要了解不同策略的存在,并显式地选择使用哪种策略。
  2. 策略类可能过多:当策略数量较多时,会导致策略类数量膨胀,增加系统复杂性。

使用场景:

  1. 权限过滤
  2. 日志系统
  3. 根据模板文件上传参数校验
  4. MSAP部署通用应用和微服务应用场景

以MSAP权限过滤案例为例,因为MSAP系统包含2套不同的权限系统,会根据使用场景自动切换权限,每一种鉴权权限系统都有的实现方式。那我们就可以将鉴权策略接口,并为每种鉴权权限方式实现一种具体的策略,在用户登陆使用MSAP系统的时候,根据配置的策略,用户子账号就可以无感知的使用数据权限鉴权。

策略模式是一种强大而灵活的设计模式,我们需要灵活使用它,它允许我们在运行时动态地改变对象的行为。通过封装算法或行为到独立的策略类中,我们提高了代码的复用性和可维护性。然而,策略模式也有其局限性,需要在具体应用场景中权衡其优缺点,合理使用。

使用策略模式注意点:

  1. 策略类数量控制:避免创建过多的策略类,以免增加系统的复杂性。
  2. 策略切换逻辑:确保策略切换的逻辑正确无误,避免出现策略切换错误或遗漏的情况。
  3. 策略配置管理:对于需要动态配置策略的场景,需要提供合理的策略配置管理机制,方便用户进行策略的选择和切换。

除此之外,在使用策略模式时还可以结合其他的设计模式一起使用,比如工厂模式,代理模式等,都是为了灵活生成动态对象!

0条评论
0 / 1000
刘****锋
2文章数
0粉丝数
刘****锋
2 文章 | 0 粉丝
刘****锋
2文章数
0粉丝数
刘****锋
2 文章 | 0 粉丝
原创

Java策略模式

2024-06-12 08:11:32
11
0

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

概念

策略模式的主要思想是定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换,让算法的变化独立于使用它的客户。

策略模式涉及到三个角色:

  1. Context(环境类):维护一个策略类的引用,负责与具体的策略类交互。
  2. Strategy(抽象策略类):定义所有支持的算法的公共接口。通常是一个接口或者抽象类,所有具体策略类需要实现这个公共接口。
  3. ConcreteStrategy(具体策略类):实现具体的算法

策略模式类图:

现在以数学中加减乘除来设计策略模式:

// 策略接口
public interface Strategy {
    public int doOperation(int num1, int num2);
}

// 具体策略类
//加法
public class MathOperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

//减法
public class MathOperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}
//乘法
public class MathOperationMultiply implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}
//除法
public class MathOperationDivision implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 / num2;
    }
}

// 上下文类
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2){
        return strategy.doOperation(num1, num2);
    }
}

那如何使用策略模式?

public class Test {
    public static void main(String[] args) {
        Context context = new Context(new MathOperationAdd());    
        System.out.println("3+ 2 = " + context.executeStrategy(3, 2));

        context = new Context(new MathOperationSubtract());    
        System.out.println("3 - 2 = " + context.executeStrategy(3, 2));

        context = new Context(new MathOperationMultiply());    
        System.out.println("3 * 2 = " + context.executeStrategy(3, 2));

        context = new Context(new MathOperationDivision());    
        System.out.println("4 / 2 = " + context.executeStrategy(4, 2));
    }
}

使用策略模式的优点:

  1. 提高了代码的复用性和可维护性,将算法的定义与其具体实现进行解耦。
  2. 可以在运行时动态替换算法,提高了程序的灵活性。
  3. 符合开闭原则,新增算法无需修改现有代码。

缺点:

  1. 客户端必须知道策略的存在:客户端需要了解不同策略的存在,并显式地选择使用哪种策略。
  2. 策略类可能过多:当策略数量较多时,会导致策略类数量膨胀,增加系统复杂性。

使用场景:

  1. 权限过滤
  2. 日志系统
  3. 根据模板文件上传参数校验
  4. MSAP部署通用应用和微服务应用场景

以MSAP权限过滤案例为例,因为MSAP系统包含2套不同的权限系统,会根据使用场景自动切换权限,每一种鉴权权限系统都有的实现方式。那我们就可以将鉴权策略接口,并为每种鉴权权限方式实现一种具体的策略,在用户登陆使用MSAP系统的时候,根据配置的策略,用户子账号就可以无感知的使用数据权限鉴权。

策略模式是一种强大而灵活的设计模式,我们需要灵活使用它,它允许我们在运行时动态地改变对象的行为。通过封装算法或行为到独立的策略类中,我们提高了代码的复用性和可维护性。然而,策略模式也有其局限性,需要在具体应用场景中权衡其优缺点,合理使用。

使用策略模式注意点:

  1. 策略类数量控制:避免创建过多的策略类,以免增加系统的复杂性。
  2. 策略切换逻辑:确保策略切换的逻辑正确无误,避免出现策略切换错误或遗漏的情况。
  3. 策略配置管理:对于需要动态配置策略的场景,需要提供合理的策略配置管理机制,方便用户进行策略的选择和切换。

除此之外,在使用策略模式时还可以结合其他的设计模式一起使用,比如工厂模式,代理模式等,都是为了灵活生成动态对象!

文章来自个人专栏
Java策略模式
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0