在这里我不想再说什么策略模式是行为型模式中的一种之类的比较笼统的话(当然这种话用还是有用的),直接上例子解析,简单易懂。设计模式很多时候就是多余接口和抽象类的灵活运用,策略模式也不例外,所以废话不多说直接开始。
先实现一个接口Algorithm
public interface Algorithm {
public void operate();
}
再写两个实现类
public class Add implements Algorithm {
public void operate() {
// TODO Auto-generated method stub
System.out.println("加法");
}
}
public class Div implements Algorithm {
public void operate() {
System.out.println("除法");
}
}
最后实现一个辅助类(有些地方会说这个辅助类可有可无,但是我还是觉得这个比较有用)
public class Assist {
private Algorithm alg;
public Assist(Algorithm alg){
this.alg = alg;
}
public void operate(){
format();
alg.operate();
}
/**
* 辅助功能
*/
public void format(){
System.out.println("格式检查");
}
}
最后调用这个Assist类即可
public class Calc {
public static void main(String[] args){
Assist as ;
as = new Assist(new Add());
as.operate();
as = new Assist(new Div());
as.operate();
}
}
当要增加算法是可以灵活添加,不影响调用的方式。
策略模式还有一种实现的方式,区别在于辅助类Assist,抽象Assist类,让各个算法继承
public abstract class AssistS {
/**
* 辅助功能
*/
public void format(){
System.out.println("格式检查");
}
}
各个算法类中继承这个抽象类作为辅助功能完善自己的功能
public class Div extends AssistS implements Algorithm {
public void operate() {
format();
System.out.println("除法");
}
}
public class Add extends AssistS implements Algorithm {
public void operate() {
// TODO Auto-generated method stub
format();
System.out.println("加法");
}
}
调用方式上麻烦了一些,调用者需要记更多的东西了(个人觉得)
public class Calc {
public static void main(String[] args){
/*Assist as ;
as = new Assist(new Add());
as.operate();
as = new Assist(new Div());
as.operate();*/
Add ad = new Add();
ad.operate();
Div dv =new Div();
dv.operate();
}
}
上面的两种策略模式的实现方式都可,至于那种更好仁者见仁,不多说了
参考:http://blog.csdn.net/zhangerqing/article/details/8243942