最近在看设计模式的,防止遗忘,总结一下,如有不足还望指正!
策略模式:(strategy)定义算法家族,分别封装起来,让他们之间可以相互替换。此模式可以让算法的变化,不影响使用算法的用户。
类图:
/**
* 抽象算法类
* Created by dell on 2014/12/30.
*/
public abstract class Strategy {
//算法方法
public abstract void AlgorithmInterface();
}
ConcreteStrategyA.java
/**
* Created by dell on 2014/12/30.
*/
public class ConcreteStrategyA extends Strategy{
//算法A实现方法
@Override
public void AlgorithmInterface() {
System.out.println("算法A实现");
}
}
ConcreteStrategyB.java
/**
* Created by dell on 2014/12/30.
*/
public class ConcreteStrategyB extends Strategy {
@Override
public void AlgorithmInterface() {
System.out.println("算法B实现");
}
}
Context.java
/**
* Created by dell on 2014/12/30.
*/
public class Context {
Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
//上下文接口
public void contextInterface(){
strategy.AlgorithmInterface();
}
}
/**
* Created by dell on 2014/12/30.
*/
public class StrategyClient {
public static void main(String[] args){
/**
* 父类引用指向子类对象,由于实例话不同的策略,最终在调用同样的方法时,得到不同的结果。
*/
Context context;
context = new Context(new ConcreteStrategyA());
context.contextInterface();
context = new Context(new ConcreteStrategyB());
context.contextInterface();
}
}
以上的解释也仅仅使自己了解了这个模式,并不了解它的使用。最近看了一个视频,才明白一点,现在分享一下,共同学习。以下用到的是一个排序算法,类图如下:
DataSort为一个排序类,为了使所有类都可以使用此类,定义了Comparable接口,包含int compareTo(Object obj)方法,正如Java JDK自带的Comparable类,使要排序的类,实现此接口,实现各自的compareTo()方法,这样就DataSort类就可以实现了复用。当然此时并没有使用到策略模式。
如上图,可以Cat含有Height,Weight属性,如果想方便的根据Height,Weight实现排序这时策略模式将是一个不错的选择。当然,也可以不使用此模式,例如在compareTo()方法的实现中每次修改排序的条件,也可以实现功能。
但是,有时我们有很多的排序规则,事先并不确定,这是修改compareTo()方法将是一个很不明智的选择。这时,可以抽象出公共算法接口,如:Comparator,而它的子类实现具体的排序规则,当需要更多的排序规则时,仅仅需要创建新的类实现Comparator就可以。这样就使我们的程序拥有更好的可扩展性。
State: