初学者:一天一个设计模式-策略模式

策略模式

  • 顾名思义,在一个类中给出通用接口方法,让其他类能够调用
  • 避免过多的if...else
  • 策略模式让一个类的行为或其算法可以在运行时更改
  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为

策略模式举例

利用comparaTo函数拓展排序算法能够接受的类

  • 和重载有点相似
  • comparable接口就是一个策略模式,它里面只有一个接口函数comparaTo
  • 简单例子,利用comparaTo, 实现Sorter类,给自定义类Cat排序

Cat.java

package java_class01;

public class Cat {
	private int size;
	private String name;
	public Cat(int size, String name) {
		super();
		this.size = size;
		this.name = name;
	}
	public int getSize() {
		return size;
	}
	public String getName() {
		return name;
	}
	public int compareTo(Cat c) {
		if(this.size < c.size) return -1;
		else if(this.size > c.size) return 1;
		else if(this.name.compareTo(c.name)==1) return 1;
		else if(this.name.compareTo(c.name)==-1) return -1;
		else return 0;
	}
	@Override
	public String toString() {
		return "Cat [size=" + size + ", name=" + name + "]";
	}
}
	

Sorter.java

package java_class01;

public class Sorter {
	public static void sort(Cat[] arr) {
		for(int i = 0;i < arr.length-1;i++) {
			int minPos = i;
			for(int j = i+1;j < arr.length;j++) {
				minPos = (arr[minPos].compareTo(arr[j]))==-1 ? minPos:j;
			}
			swap(arr, minPos, i);
		}
	}
	public static void swap(Cat[] arr, int i, int j) {
		Cat tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
}

Main.java

package java_class01;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		final int NUM = 10;
		Cat []c = new Cat[NUM];
		
		for(int i = 0;i < NUM;i++) {
			int x = (int) (Math.random()*100);
			String name = "Tom_"+i;
			c[i] = new Cat(x, name);
		}
		System.out.println(Arrays.toString(c));
		Sorter.sort(c);
		System.out.println(Arrays.toString(c));
	}
}

总结

  • 策略模式主要在于提供通用方法接口
  • 当各个类中的方法的算法比较统一,区别只在于一些成员变量的时候,尽可能将算法封装为统一的接口,不同类中调用的时候再实现

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值