那些你要知道的设计模式之-策略
2018-04-22 本文已影响16人
小巨人Vea
一.定义
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
二.介绍
策略者模式也是常见的一种模式,在开发过程中无意中就被使用,这次我直接为大家来讲解案例,先看一下策略者模式的基本类图
策略者模式
策略者模式分为三个角色
-
Context 封装类
内部维护一个Strategy的实例,承接上下文启封装作用
负责跟Strategy之间的交互调用Startegy的具体算法 -
IStrartegy 抽象策略类
定义各种不同的算法策略(AlgorithmInterface),供Context调用 -
ConcreteStrategy 具体策略类
实现IStrategy接口,提供具体的算法实现
三. 应用
基本的概念已经讲清楚了,接下来用一个案例加深对策略者模式的理解
背景: 进书店去买书
VIP半价,普通用户不打折
步骤一: 定义策略抽象类IStrartegy
public interface IStrategy {
//消费
void spend(int originalPrice);
}
步骤二: 声明策略抽象类的两个实现类
public class VIPStrategy implements IStrategy {
@Override
public void spend(int originalPrice) {
System.out.println("会员购买"+originalPrice+"$的书花费"+originalPrice+"$");
}
}
public class CommonStartegy implements IStrategy {
@Override
public void spend(int originalPrice) {
System.out.println("普通用户购买"+originalPrice+"$的书花费"+originalPrice+"$");
}
}
步骤三: 定义封装类,让会员和普通用户清楚该消费多少
public class Context {
private IStrategy strartegy;
public Context(IStrategy strartegy) {
this.strartegy = strartegy;
}
public void spend(int originalPrice){
this.strartegy.spend(originalPrice);
}
}
通过下面这个场景我们来看一下会员和普通用户在购买100$价格的书的时候,该消费多少
public static void main(String[] args) {
IStrategy strategy = new VIPStrategy();
//VIP买书
Context context = new Context(strategy);
//花费原价的一半
context.spend(100);
//不是会员买书
context = new Context(new CommonStartegy());
//不打折
context.spend(100);
}
其运行结果:
会员购买100$的书花费100$
普通用户购买100$的书花费100$
四 总结
好处
- 避免使用多重条件判断if else 语句。简化操作易于维护
- 应对不同的变更,更加易于扩展,通过封装对外,
缺点
- 策略不同,策略类会增加,类的数量会增加,而且策略类是对外暴露的
使用场景
- 几个类它们的行为属于一个方向,只是它们的算法不同,可以使用策略者模式封装成不同的算法,让这些类选择