设计模式:策略模式(Strategy)

本文深入探讨了策略模式在软件设计中的应用,通过定义、结构、实现及优势,展示了如何将算法与业务逻辑分离,提高系统的灵活性与可维护性。策略模式通过引入环境角色、抽象策略角色与具体策略角色,实现算法的动态切换,适用于多种业务场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/jungle_hello

定义

策略模式(Strategy)属于对象行为型设计模式,主要是定义一系列的算法,把这些算法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。这里的算法不要狭义的理解为数据结构中算法,可以理解为不同的业务处理方法。

这种做法会带来什么样的好处呢?
它将算法的使用和算法本身分离,即将变化的具体算法封装了起来,降低了代码的耦合度,系统业务策略的更变仅需少量修改。
算法被提取出来,这样可以使算法得到重用,这种情况还可以考虑使用享元模式来共享算法对象,来减少系统开销(但要注意使用享元模式的建议条件)。

结构

先由定义来想象下它的结构吧:要使算法拥有共同的接口,这样就要实现一个接口或者
一个抽象类出来才行。这样基本上轮廓也就出来了,我们来看看吧:
策略模式由三个角色组成:
1) 算法使用环境角色(Context):算法被引用到这里和一些其它的与环境有关的操作一起来完成任务。
2) 抽象策略角色(Strategy):规定了所有具体策略角色所需的接口。在java 它通常由接口或者抽象类来实现。
3) 具体策略角色(Concrete Strategy):实现了抽象策略角色定义的接口。

策略模式各个角色之间关系的类图表示:
这里写图片描述

策略模式的实现

//抽象策略--Strategy- 
public interface Calculate {
    //一个待实现方法  
    int calculate(int a,int b);
}
//具体策略角色--Concrete Strategy1
public class AddCalculate implements Calculate {

    @Override
    //接口方法具体实现之加法 
    public int calculate(int a, int b) {
        return a+b;
    }

}
//具体策略角色--Concrete Strategy2 
public class DivideCalculate implements Calculate{
    @Override
    //接口方法具体实现之除法 
    public int calculate(int a, int b) {
        return a/b;
    }
}
//算法使用环境角色--Context 
public class EnvironmentRole {
    private Calculate cal;
    //构造方法对变量完成赋值  
    public EnvironmentRole(Calculate cal)
    {
        this.cal = cal;
    }
    //获得策略类对象 
    public Calculate getCalculate()
    {
        return cal;
    }
    //用set方法注入策略对象  
    public void setCalculate(Calculate cal)
    {
        this.cal = cal;
    }
    //环境角色中的接口方法,其具体结果依赖于策略引用指向的具体策略角色对象 
    public int calculate(int a,int b) {
        return cal.calculate(a, b);
    }
}
//一个客户端演示  
public class Client {
    public static void main(String[] args)
    {
        Calculate add = new AddCalculate();
        EnvironmentRole environmentRole = new EnvironmentRole(add);
        System.out.println(environmentRole.calculate(3, 4));

        Calculate divide = new DivideCalculate();
        EnvironmentRole environment = new EnvironmentRole(divide);
        System.out.println(environment.calculate(9, 3));


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值