举个简单的例子:你给医生描述症状(参数),医生听后会做出一个行为就是给你拿药方(接口),具体拿的什么药方是根据你的情况而定的(多种策略---接口实现类)。整个过程其实就是将行为抽象出一个接口,通过对接口的多种实现,即独立封装实现类,运行时可以按照需求相互替换,这样可维护性强也不影响其他实现类。
实际上是遵循OO设计原则:①面向接口(抽象)编程。②独立封装变化。③多组合(比如:set注入),少继承。
实现有三步:1.抽象出接口。2.实现接口。3.将实现类与业务类组合产生关系。
下面是代码实现:
public class Strategy {
public static void main(String[] args) {
UserService user = new UserService();
user.login();
//策略体现在这,通过set不同的策略来实现替换
user.setBaseSave(new FileSave());
user.add("个人信息数据");
}
}
/**
* 策略模式:一个接口有多个实现,通过独立封装实现类,运行时可以按照需求相互替换,这样可维护性强,新增接口也不影响其他实现类
* 把可变的行为抽象出来,定义一系列的逻辑处理
* 该模式把 逻辑处理部分 让使用它的类而独立变化
*/
interface BaseSave{
//数据保存方法
public void save(String data);
}
//先定义好三种策略,根据情况随机替换,即在这添加策略不影响其他已存在的策略
class FileSave implements BaseSave{
//保存数据到文件
public void save(String data){
System.out.println(data+" 已被保存到文件。");
}
}
class NetSave implements BaseSave{
//保存数据到网络
public void save(String data){
System.out.println(data+" 已被保存到网络。");
}
}
class DatabaseSave implements BaseSave{
//保存数据到数据库
public void save(String data){
System.out.println(data+" 已被保存到数据库。");
}
}
class BaseService{
//使接口与业务类产生关系
private BaseSave baseSave;
public void setBaseSave(BaseSave baseSave){
this.baseSave = baseSave;
}
public void add(String data){
System.out.println("检查数据合法性...");
baseSave.save(data);
System.out.println("添加数据完毕。");
}
}
class UserService extends BaseService{
//未继承的其他方法定义
public void login(){
System.out.println("登录");
}
}
测试结果: