常用设计模式——策略模式

1.为什么使用策略模式

  我们在软件开发的时候会遇到这样一种情况,某一个功能可以通过多种算法或者策略来完成,通常要根据不同的环境来选择某一种算法或者策略。
  在学习编程初期,我们可能会采用一种硬编码(Hard Coding)的方式来解决这个问题。如我们在一个类中定义一连串的方法,每个方法里实现一种算法;或者使用if-esle、switch-case来选择具体的算法。这两种方法都被称为硬编码,它们可维护性非常低,当有新的算法添加或者修改,我们要改变很多源代码以支持。
  因此,我们定义一系列算法,把每一个算法封装起来,并且使他们可相互替换,从而使得算法可独立于使用它的客户而变化。这就是策略模式。

2.如何设计

首先,我们应了解策略模式的实现应有三种角色:
环境(Context):持有一个Strategy引用。
抽象策略(Strategy):通常为一个接口或者抽象类,在此描述具体策略类里需要的接口。
具体策略(Concrete Strategy):在此填充具体的算法或策略。

  我们把一个类中可能变化的部分抽取出来,作为一个接口。然后在环境中包含这个接口的成员变量,通过其构造方法来获得继承这个接口的类的实例,并实例化这个成员变量。在主体中调用环境中的执行方法即可。

3.代码实现

首先定义抽象策略

/**
 * 抽象接口,定义一个引擎启动方式
 * 
 * @author Anthony
 *
 */
public interface EngineStrategy {
    public void engineStart();
}

然后定义具体策略

/**
 * 电力汽车继承接口,展现电力发动汽车
 * 
 * @author Anthony
 *
 */
public class ElectricCar implements EngineStrategy {

    @Override
    public void engineStart() {
        System.out.println("电力汽车,电能发动机");
    }

}

/**
 * 传统汽车继承接口,展现汽油发动汽车
 * 
 * @author Anthony
 *
 */
public class TraditionalCar implements EngineStrategy {

    @Override
    public void engineStart() {
        System.out.println("传统汽车,汽油发动机");
    }

}

之后定义环境类

/**
 * 环境类里接收参数,判断你要展现那种汽车
 * 
 * @author Anthony
 *
 */
public class Context {
    private EngineStrategy engineStrategy;

    public Context(EngineStrategy engineStrategy) {
        this.engineStrategy = engineStrategy;
    }

    public void execute() {
        this.engineStrategy.engineStart();
    }
}

主函数使用

public class StrategyMain {

    public static void main(String[] args) {
        Context context;
        context = new Context(new ElectricCar());
        context.execute();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值