Open wowGZ opened 6 years ago
设计一个抽象策略类,以及若干个实现具体功能的抽象策略类的具体策略类。这样,在主函数中可以通过向上转型来实现具体功能,而且以后如果需要增加更多的具体策略类,不需要重新写主函数以及抽象策略类的代码,只需要按照要求增加对应的具体策略类,就可以对其进行调用。 以第一次写的排序算法作为例子:
abstract class BaseSort {
public void sort(int[] a){
}
}
public class SelectSort extends BaseSort{ //继承BaseSort抽象策略类
@Override
public void sort(int[] a) {
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++) {
if(a[min] > a[j]){
min = j;
}
}
if(i != min){
int temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
public class InsertSort extends BaseSort{ //继承BaseSort抽象策略类
@Override
public void sort(int[] a) {
int i, j, insertNote = 0;// 要插入的数据
for (i = 1; i < a.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
insertNote = a[i];// 设置数组中的第2个元素为第一次循环要插入的数据
j = i - 1;
while (j >= 0 && insertNote < a[j]) {
a[j + 1] = a[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
j--;
}
a[j + 1] = insertNote;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
}
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
}
}
public class QuickSort extends BaseSort{ //继承BaseSort抽象策略类
@Override
public void sort(int[] a) { //对抽象策略类的方法进行重写
quicksort(a, 0, a.length - 1); //因为要被调用的是sort()方法,所以QuickSort的
for (int i = 0; i < a.length; i++) { //具体实现需要另外定义一个方法进行设计
System.out.print(a[i] + " "); //然后在sort()中进行调用
}
}
public void quicksort(int[] a, int low, int height){ //实现快速排序的具体方法
int i, j, index;
if (low > height) {
return;
}
i = low;
j = height;
index = a[i];
while (i < j) {
while (i < j && a[j] >= index) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] < index) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
a[i] = index;
quicksort(a, low, i - 1);
quicksort(a, i + 1, height);
}
}
import java.util.Scanner;
public class Person { private BaseSort sort;
public void setSort(BaseSort sort){
this.sort = sort;
}
public void doSort(int[] a){
sort.sort(a);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Person person = new Person();
int[] a = new int[5];
// 数组初始化 for (int i = 0; i < a.length; i++) { a[i] = scanner.nextInt(); }
// 输出数组排序前的顺序 System.out.println("数组排序前顺序如下:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } System.out.println();
System.out.println("请问您想要使用什么排序方法对此数组进行排序?");
System.out.println("1、选择排序;");
System.out.println("2、快速排序;");
System.out.println("3、插入排序;");
int i = scanner.nextInt();
switch (i) {
case 1:
person.setSort(new SelectSort()); //向上转型调用子类重写的方法
person.doSort(a);
case 2:
person.setSort(new QuickSort()); //向上转型调用子类重写的方法
person.doSort(a);
case 3:
person.setSort(new InsertSort()); //向上转型调用子类重写的方法
person.doSort(a);
default:
System.out.println("您输入的数据有误!");
}
}
}
### 优点:
- 对于子类数据的封装更彻底;
- 使得整个代码的结构更加清晰明了
### 缺点:
- 随着具体策略类的增加子类会越来越多,个人感觉会不那么容易管理,而且所占空间会越来越多。
import java.util.ArrayList;
import java.util.Iterator;
public class Traversal{
public void traversal_fori(ArrayList<Person> t){ //fori遍历
System.out.println("使用fori循环遍历集合结果如下:");
for (int i = 0; i < t.size(); i++) {
System.out.println("年龄:" + t.get(i).getAge() + "姓名:"+ t.get(i).getName());
}
}
public void traversal_foreach(ArrayList<Person> t){ //foreach遍历
System.out.println("使用foreach循环遍历集合结果如下:");
for (Person s:
t) {
System.out.println("年龄:" + s.getAge() + "姓名:"+ s.getName());
}
}
public void traversal_iterator(ArrayList<Person> t){
Iterator<Person> personIterator = t.iterator();
System.out.println("使用迭代器遍历集合结果如下:");
while(personIterator.hasNext()){
Person person = (Person)personIterator.next();
System.out.println("年龄:" + person.getAge() + "姓名:"+ person.getName());
}
}
}
- 以上是设计的Traversal类的代码,下面让我们设计一个Test类对以上Traversal类进行一下测试
```java
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Person> students = new ArrayList<>();
students.add(new Person(2 , "b"));
students.add(new Person(1 , "a"));
students.add(new Person(3 , "c"));
students.add(new Person(4 , "d"));
students.add(new Person(5 , "e"));
students.add(new Person(6 , "f"));
students.add(new Person(7 , "g"));
students.add(new Person(8 , "h"));
students.add(new Person(9 , "i"));
students.add(new Person(10, "j"));
Traversal traversal = new Traversal();
traversal.traversal_fori(students);
traversal.traversal_foreach(students);
traversal.traversal_iterator(students);
}
}