1.定义
策略模式Strategy是⼀种⾏为设计模式, 它能让你定义⼀系列算法, 并将每种算法分别放⼊独⽴的类中, 以使算法的对象能够相互替换。
2.策略模式的结构
3.案例代码
策略接口:
public interface UserDao { // 定义数据访问对象 public void insert(); public void update(); public void delete(); public void findById(); }
策略实现类Jdbc:
public class JdbcDao implements UserDao { @Override public void insert() { System.out.println("JDBC方式实现数据插入"); } @Override public void update() { System.out.println("JDBC方式实现数据更新"); } @Override public void delete() { System.out.println("JDBC方式实现数据删除"); } @Override public void findById() { System.out.println("JDBC方式实现数据查询"); } }
策略实现类Odbc:
public class OdbcDao implements UserDao { @Override public void insert() { System.out.println("Odbc方式实现数据插入"); } @Override public void update() { System.out.println("Odbc方式实现数据更新"); } @Override public void delete() { System.out.println("Odbc方式实现数据删除"); } @Override public void findById() { System.out.println("Odbc方式实现数据查询"); } }
策略实现类Jndi:
public class JndiDao implements UserDao { @Override public void insert() { System.out.println("JNDI方式实现数据插入"); } @Override public void update() { System.out.println("JNDI方式实现数据更新"); } @Override public void delete() { System.out.println("JNDI方式实现数据删除"); } @Override public void findById() { System.out.println("JNDI方式实现数据查询"); } }
Contenxt上下⽂类:⽤于使⽤策略,通过策略接⼝完成代码逻辑内部持有接⼝
public class UserService { public UserDao dao = null; // 从外侧传入对应的策略 public UserService(UserDao dao) { this.dao = dao; } // 完成业务逻辑 public void createUser(){ System.out.println("正在创建用户对象"); dao.insert(); } }
客户端:在运行时决定到底使用那种策略完成业务逻辑
public class Client { public static void main(String[] args) { // 根据输入的文本,创建不同的策略 Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); UserDao dao = null; switch (input) { case "jdbc": dao = new JdbcDao(); break; case "odbc": dao = new OdbcDao(); break; case "jndi": dao = new JndiDao(); break; default: dao = new JdbcDao(); } // 创建的策略直接传入到上下文当中 UserService userService = new UserService(dao); userService.createUser(); } }
4.策略模式优点:
你可以在运⾏时切换对象内的算法。
你可以将算法的实现和使⽤算法的代码隔离开来。
你可以使⽤组合来代替继承。
开闭原则。 你⽆需对上下⽂进⾏修改就能够引⼊新的策略。
5.策略模式缺点:
如果你的算法极少发⽣改变, 那么没有任何理由引⼊新的类和接⼝。 使⽤该模式只会让程序过于复杂。
客户端必须知晓策略间的不同——它需要选择合适的策略。
许多现代编程语⾔⽀持函数类型功能, 允许你在⼀组匿名函数中实现不同版本的算法。 这样, 你使⽤这些函数的⽅式就和使⽤策略对象时完全相同, ⽆需借助额外的类和接⼝来保持代码简洁。
6.策略模式应⽤场景
当你想使⽤对象中各种不同的算法变体, 并希望能在运⾏时切换算法时, 可使⽤策略模式。
当你有许多仅在执⾏某些⾏为时略有不同的相似类时, 可使⽤策略模式。
如果算法在上下⽂的逻辑中不是特别重要, 使⽤该模式能将类的业务逻辑与其算法实现细节隔离开来。