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

本文介绍了策略模式的概念、结构及代码实现,展示了如何通过策略模式来封装算法,并允许算法独立于使用它的客户端变化。

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

一、定义

策略模式:定义了算法族(将一组行为想象成一族算法),分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

二、策略模式的结构

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的额对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。也就是说,准备一组算法并将每一个算法封装起来,使得它们可以互相互换。看下面的结构框图:

image

我们由框图得到三个角色:
(1)环境角色(context):持有一个Strategy的引用;
(2)抽象策略模式(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
(3)具体策略角色(ConcreteStrategy):包装了相关的算法或行为。

三、代码实例

package Model;

/**
 * Created by L_kanglin on 2017/3/6.
 */
public class Context {
    //注意这是个接口
    private Strategy strategy;
    /*
     *构造一个函数,传入一个具体策略对象
     * @param strategy
     */
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    /*
    * 策略方法
    * */
    public void congtextInterface(){
        strategy.strategyInterfece();
    }
}


public interface Strategy {
    //策略方法,抽象方法,等着后面去实现
    public void strategyInterfece();
}

public class ConcreteStrategyA implements Strategy {
    @Override
    public void strategyInterfece() {
        //进行相关的业务
    }
}

public class ConcreteStrategyB implements Strategy {
    @Override
    public void strategyInterfece() {
        //进行相关的业务
    }
}

public class ConcreteStrategyC implements Strategy {
    @Override
    public void strategyInterfece() {
        //进行相关的业务
    }
}

/**
 * Created by L_kanglin on 2017/3/6.
 */
public class Client {
    public static void main(String[] args){
        //选择并创建需要使用到的策略对象,一种多态的展示
        Strategy strategy = new ConcreteStrategyA();
        Context context = new Context(strategy);
        //执行业务
        context.congtextInterface();
        //然后执行各自的子方法

    }
}

从上面的实例中,策略模式仅仅是封装算法,提供新的算法插入到已有的系统中,以及以前的算法从系统中淘汰的方法,策略模式并不决定何时使用某种算法,在什么情况下使用算法是由客户端决定的。

四、分析

(1)策略模式保证了各个策略算法的平等性,对于一系列的具体实现,大家的地位是平等的,实现各个具体算法实现之间的相互切换,而它们彼此之间是没有依赖的可以理解为是相同行为的不同实现;
(2)运行期间,策略模式在同一个时刻只能使用一个具体的策略实现;
(3)所有的具体策略类都有一些公有的行为。此时就应该把这些公有的行为放到共同的抽象策略角色Strategy中。

文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值