策略模式(常用)

策略模式的简介

        在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。

        策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。

策略模式的结构

  • 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用

策略模式的优缺点

  优点:

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好

  缺点:

  1. 策略类会增多。
  2. 所有策略类都需要对外暴露。

策略模式的使用场景

        一个对象,其行为有些固定不变,有些又容易变化。对于这些容易变化的行为,我们不希望将其实现绑定在对象中,而希望能够动态地针对不同场景产生不同应对的策略。 这时就要用到策略模式,就是为了应对对象中复杂多变的行为而产生的:

  • 系统有很多类,而他们的区别仅在于行为不同
  • 一个系统需要动态地在几种算法中选择一种

直接代码理解

//抽象策略(Strategy)类
//创建购买汽车策略接口
public interface CarStrategy {

    public void buyCar();

}

//具体策略(Concrete Strategy)类
//创建购买奔驰车类,实现CarStrategy接口。
public class BcCar implements CarStrategy {

    @Override
    public void buyCar() {
        System.out.println("欢迎购买奔驰E300L。。。。。。");
    }

}

//创建购买宝马车类,实现CarStrategy接口。
public class BmwCar implements CarStrategy {

    @Override
    public void buyCar() {
        System.out.println("欢迎购买宝马530Li。。。。。。");
    }

}

//创建购买奥迪车类,实现CarStrategy接口。
public class AudiCar implements CarStrategy {

    @Override
    public void buyCar() {
        System.out.println("欢迎购买奥迪A6L。。。。。。");
    }

}
//环境(Context)类
//创建汽车环境类。
public class CarContext {

    private CarStrategy carStrategy;

    public CarContext(CarStrategy carStrategy){
        this.carStrategy = carStrategy;
    }

    public void buyCarStrategy(){
        carStrategy.buyCar();
    }

}
    //Test
    @Test
    public void testStrategy(){
        // 宝马车
        CarContext bmwCarContext = new CarContext(new BmwCar());
        bmwCarContext1.buyCarStrategy();
        // 奔驰车
        CarContext bcCarContext = new CarContext(new BcCar());
        bcCarContext.buyCarStrategy();
        // 奥迪车
        CarContext audiCarContext = new CarContext(new AudiCar());
        audiCarContext.buyCarStrategy();
    }

我觉得这个模式比较好理解,也就是用来解决在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

你可能感兴趣的:(策略模式,java)