天天看点

浅谈23种设计模式之策略设计模式

策略模式

1、简介

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如对于上班族来说,每周都会去公司上班,那么我们去公司的方式有多种多样,比如我们可以选择步行,骑单车,开车或者坐公交车等。再比如我们的高德导航系统,在提供导航服务的时候会根据客户需求的不同提供相应的导航策略,比如步行导航,开车导航等。下面看一个关于策略模式的类图

浅谈23种设计模式之策略设计模式

2、应用场景

应用场景:

1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

3、优缺点

优点

  • 算法可以自由切换
  • 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
  • 扩展性良好,增加一个策略只需实现接口即可

缺点

  • 策略类数量会增多,每个策略都是一个类,复用的可能性很小
  • 所有的策略类都需要对外暴露

4、具体实现

​ 下面就写一个简单的去公司上班的demo来加以说明

1.策略角色

/**
 *
 * 定义行为或者功能,在这里我的行为就是去公司,每个策略或算法必须具有的方法和属性
 */
public abstract class Strategy {
	//去公司
    abstract void gotoCompany();
}
           

2.上下文Context

/**
 *
 * Context上下文角色,或者Context封装角色,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化
 */
public class Context {
	
    //持有策略的引用
    private Strategy strategy;

    public Context() {
        this.strategy = null;
    }
	//灵活配置策略
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
	//根据不同的策略调用不同的行为
    public void contextInterface() {
        strategy.gotoCompany();
    }
}
           

3.具体策略角色

/**
 * 
 * 步行去公司
 */
public class Walk extends Strategy{

    @Override
    void gotoCompany() {
        System.out.println("今天天气好我步行去公司");
    }
}

/**
 * 
 * 开车去公司
 */
public class Drive extends Strategy {

    @Override
    void gotoCompany() {
        System.out.println("今天下雨我开车去公司");
    }
}
           

4. Client客户端

在这里我们可以根据需要选择不同的策略,也就是暴露给用户可选的策略

public class Client {

    public static void main(String[] args) {

        Context context = new Context();
		//配置具体策略
        context.setStrategy(new Drive());
		//行为或功能
        context.contextInterface();
		//配置具体策略
        context.setStrategy(new Walk());
		//行为或功能
        context.contextInterface();
    }
}
           

5. 测试结果打印

浅谈23种设计模式之策略设计模式

初次学习,欢迎大家批评指正,谢谢!

继续阅读