标签:
所谓策略模式指的就是当某个行为有多种实现方式并且随着时间的发展还可能有更多的实现方式时,可以让这些具体实现继承自某个基类或者实现某个共同的接口,从而在调用策略(实现)的时候就不用考虑具体的实现。策略模式很好的实现了行为和行为的实现之间的分离,使得行为的调用更加稳定(不需要随着实现的改变而改变调用)。比如说,要实现一个排序算法,已有的排序算法有冒泡、选择、快速排序、桶排序等,这是就可以定义一个排序接口,然后让冒泡、选择等都实现此接口,这样就可以通过调用接口来实现对具体算法的调用(用实现公共接口的类来实例化接口)。
假设有Bee,Bird,Butterfly三种会飞的动物,它们在攻击之前都会有一次飞行行为,现在我们通过策略模式来实现三种飞行动物的攻击行为,以使得客户端调用的时候不必考虑具体的对象和实现。(说明:为演示方便起见,抽象策略类和具体策略类访问权限都设置为默认,实际设计中一般将抽象策略类和具体策略类都定义为public以便在客户端调用)
//抽象策略类
abstract class Attack{
public void fly(){
System.out.println("Attack fly()");
}
public abstract void attack();
}
//具体策略类-Bee
class Bee extends Attack{
public void attack(){
System.out.println("Bee attack()");
}
}
//具体策略类-Bird
class Bird extends Attack{
public void attack(){
System.out.println("Bird attack()");
}
}
//具体策略类-Butterfly
class Buterfly extends Attack{
public void attack(){
System.out.println("Butterfly attack()");
}
}
public class AttackTest{
private Attack a;
public static void main(String[] args){
//根据具体需求实例化抽象基类
a =new Bird();
//实现攻击
a.attack();
}
}
假设现在需要实现某个排序功能,已有的排序算法有选择、冒泡、桶排序等;下面我们使用排序接口通过策略模式来加以实现;
//抽象排序接口
public interface ISort{
void sort(int[] a);
}
//具体排序算法-冒泡排序
public class MaoPaoSort implements ISort{
void sort(int[] a){
...//具体实现忽略
}
}
//具体排序算法-桶排序
public class TongSort implements ISort{
void sort(int[] a){
...//具体实现忽略
}
}
//客户端调用排序算法
public class SortTest{
//根据需要将接口实例化
private Sort s=new TongSort();
static void sortTest(int[] a){
s.sort(a);
}
public static void main(String[] args){
int[] a={1,2,5,4,2};
sortTest(a);
}
}
一般来说,策略模式主要的作用就是将方法的调用和具体的实现相分离,保证即使实现改变了,客户端调用也不需要改变。至于是选择通过抽象类还是通过接口来实现策略模式则看具体情况,一般而言,如果确定几个具体实现之间有公共的实现部分,比如说打印功能,无论是在控制台打印还是在打印机上打印都会先生成打印字符串,那么打印策略就可以使用抽象类来实现,以便将生成字符串那部分代码在抽象类中直接实现,避免在具体实现中重复写代码;否则就使用接口来实现策略模式。
标签:
原文地址:http://www.cnblogs.com/simple-stupid/p/5399387.html