一,策略模式
策略模式定义了一套算法族, 对每一种算法进行封装, 并提供一个顶层的接口或者抽象类满足算法间的互换
二,UML类图
1,Strategy : 策略模式算法族的顶层接口,定义了行为方法;
2,ConcreteStrategy : 具体策略算法,实现Strategy接口,重写策略方法,确定某一具体行为
3,Context : 环境类,使用算法的角色,在解决问题时可能采用不同的策略,持有Strategy的引用并进行算法应用
三,代码分析 --- 以快递为例
1,快递接口
public interface Express {
public void send();
}
接口中提供了一个发快递的方法
2,快递具体实现
public class DFExpress implements Express {
@Override
public void send() {
System.out.println("东风速递, 全球必达");
}
}
public class JDExpress implements Express{
@Override
public void send() {
System.out.println("京东进行派送");
}
}
public class SFExpress implements Express {
@Override
public void send() {
System.out.println("顺丰进行派送");
}
}
public class YDExpress implements Express {
@Override
public void send() {
System.out.println("默认韵达快递...");
}
}
统一实现了快递(Express)接口,并重写了send()方法,分别定义不同的发送方式
3,环境类
public class SendPackage {
public void sendPackage(String status) {
Express express = ExpressFactory.newInstance(status);
express.send();
}
}
客户端传递制定的算法编码到环境类中, 环境类传递该状态并通过简单工厂模式实例化对象
4,工厂类
public class ExpressFactory {
public static Express newInstance(String status) {
if (ExpressEnum.SF_EXPRESS.getStrValue().equals(status)) {
return new SFExpress();
} else if (ExpressEnum.JD_EXPRESS.getStrValue().equals(status)) {
return new JDExpress();
} else if (ExpressEnum.DF_EXPRESS.getStrValue().equals(status)) {
return new DFExpress();
}
return new YDExpress();
}
}
工厂类中,接收环境类传递的状态,并使用枚举进行比对并创建对象
5,枚举类
public enum ExpressEnum {
SF_EXPRESS("1"), JD_EXPRESS("2"), DF_EXPRESS("3"), YD_EXPRESS("4");
private String value;
private ExpressEnum(String value) {
this.value = value;
}
public Integer getValue() {
return Integer.valueOf(value);
}
public String getStrValue() {
return value;
}
}
6,测试类
public class ExpressTest {
public static void main(String[] args) {
// 创建包裹
SendPackage sendPackage = new SendPackage();
// 发送包裹
sendPackage.sendPackage(ExpressEnum.DF_EXPRESS.getStrValue());
}
}
7,测试结果
最终运行结果
8,设计考虑
* 引用工厂类 : 正式开发环境中,前后台交互类似于这样的场景传递基本会以CODE形式为主,后台需要对该CODE进行解析,这就需要添加分支判断;
* 引用枚举类 : 对CODE应该提供一个标准的类进行约束,不能依靠习惯默认,项目成长起来后,基础的东西往往会造成意想不到的后果;
四,利弊分析
* 很明显,策略模式提供了一套可扩展的算法族,用户可以自定义行为调用对应的算法进行处理,增强了代码的灵活性和可扩展性
* 在类结构中,每一种算法的添加,都需要定义对应的类。这在大型项目中很容易造成类结构过于臃肿!
五,个人理解 --> 工厂模式和策略模式
* 工厂模式提供了一个对象
* 策略模式提供了一个功能接口