大家好,欢迎来到IT知识分享网。
策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的原则 1.封装变化的概念 2.编程中使用接口,而不是对接口的实现 •面向接口的编程 策略模式的定义 1.定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 2.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化 策略模式的意义 1.策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。 2.弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性 策略模式的组成 1.抽象策略角色:策略类,通常由一个接口或者抽象类实现 2.具体策略角色:包装了相关的算法和行为 3.环境角色:持有一个策略类的引用,最终给客户端调用的。 策略模式的实现 1.策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。 2.策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。 3.环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端
策略模式的编写步骤
–1.对策略对象定义一个公共接口。
–2.编写策略类,该类实现了上面的公共接口
–3.在使用策略对象的类中保存一个对策略对象的引用。
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
实现例子1:
1.对策略对象定义一个公共接口
Strategy.java
public interface Strategy { public int calculate(int a, int b); }
–2.编写策略类,该类实现了上面的公共接口
AddStrategy.java
public class AddStrategy implements Strategy { public int calculate(int a, int b) { return a + b; } }
SubtractStrategy .java
public class SubtractStrategy implements Strategy { public int calculate(int a, int b) { return a - b; } }
MultiplyStrategy.java
public class MultiplyStrategy implements Strategy { public int calculate(int a, int b) { return a * b; } }
DivideStrategy.java
public class DivideStrategy implements Strategy { public int calculate(int a, int b) { return a / b; } }
以上分别实现加减乘除的四种策略
–3.在使用策略对象的类中保存一个对策略对象的引用。
Environment.java
public class Environment { private Strategy strategy; }
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
Environment.java
public class Environment { private Strategy strategy; public Environment(Strategy strategy) { this.strategy = strategy; } public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public int calculate(int a ,int b) { return strategy.calculate(a , b); } }
测试:
Client.java
public class Client { public static void main(String[] args) { AddStrategy addStrategy = new AddStrategy(); Environment environment = new Environment(addStrategy); System.out.println(environment.calculate(3, 4)); SubtractStrategy subtractStrategy = new SubtractStrategy(); environment.setStrategy(subtractStrategy); System.out.println(environment.calculate(3, 4)); MultiplyStrategy multiplyStrategy = new MultiplyStrategy(); environment.setStrategy(multiplyStrategy); System.out.println(environment.calculate(3, 4)); DivideStrategy divideStrategy = new DivideStrategy(); environment.setStrategy(divideStrategy); System.out.println(environment.calculate(3, 4)); } }
实现例子2:
1.对策略对象定义一个公共接口
SortInterface.java
import java.util.List; public interface SortInterface { public void sort(List<Person> list); }
Person.java
public class Person { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
–2.编写策略类,该类实现了上面的公共接口
DownNameSort .java
import java.util.Collections; import java.util.Comparator; import java.util.List; public class DownNameSort implements SortInterface, Comparator<Person> { public void sort(List<Person> list) { Collections.sort(list, this); } public int compare(Person o1, Person o2) { int result = o2.getName().compareTo(o1.getName()); if(0 == result) { return o1.getId() - o2.getId(); } return result; } }
UpNameSort .java
import java.util.Collections; import java.util.Comparator; import java.util.List; public class UpNameSort implements SortInterface, Comparator<Person> { public void sort(List<Person> list) { Collections.sort(list, this); } public int compare(Person o1, Person o2) { int result = o1.getName().compareTo(o2.getName()); if(0 == result) { return o1.getId() - o2.getId(); } return result; } }
–3.在使用策略对象的类中保存一个对策略对象的引用。
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
Environment.java
import java.util.List; public class Environment { private SortInterface sortInterface; public Environment(SortInterface sortInterface) { this.sortInterface = sortInterface; } public Environment() { } public void setSortInterface(SortInterface sortInterface) { this.sortInterface = sortInterface; } public void sort(List<Person> list) { this.sortInterface.sort(list); } }
测试
Client.java
import java.util.ArrayList; import java.util.List; public class Client { public static void main(String[] args) { Person p1 = new Person(); p1.setName("Tom"); p1.setId(1); p1.setAge(20); Person p2 = new Person(); p2.setName("Tonny"); p2.setId(2); p2.setAge(50); Person p3 = new Person(); p3.setName("Tom"); p3.setId(5); p3.setAge(30); Person p4 = new Person(); p4.setName("ABC"); p4.setId(8); p4.setAge(10); Person p5 = new Person(); p5.setName("Xyz"); p5.setId(9); p5.setAge(15); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); list.add(p3); list.add(p4); list.add(p5); Environment env = new Environment(); UpNameSort uns = new UpNameSort(); env.setSortInterface(uns); env.sort(list); for (int i = 0; i < list.size(); i++) { Person p = list.get(i); System.out.println("id: " + p.getId() + ", name: " + p.getName() + ", age:" + p.getAge()); } System.out.println("--------------"); DownNameSort dns = new DownNameSort(); env.setSortInterface(dns); env.sort(list); for (int i = 0; i < list.size(); i++) { Person p = list.get(i); System.out.println("id: " + p.getId() + ", name: " + p.getName() + ", age:" + p.getAge()); } } }
策略模式的缺点
–1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
–2.造成很多的策略类。解决方案
–采用工厂方法
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/154331.html