Java设计模式01-策略模式
一、策略模式的定义 |
定义了算法簇,分别封装起来,让它们之间可以互相替代,此模式让算法的变化独立于使用算法的客户。
二、Java实现例子 |
package strategy; public class Human { //这里面向接口的编程方式,使用接口的引用。 protected SayHelloBehavior sayHelloBehavior; //打招呼的方法 public void sayHello() { sayHelloBehavior.sayHello(); } public SayHelloBehavior getSayHelloBehavior() { return sayHelloBehavior; } public void setSayHelloBehavior(SayHelloBehavior sayHelloBehavior) { this.sayHelloBehavior = sayHelloBehavior; } }
定义一个打招呼的接口
package strategy; public interface SayHelloBehavior { void sayHello(); }
定义一个英国人类和用英语打招呼的实现类。
package strategy; //实现打招呼接口 public class SayHelloByEnglish implements SayHelloBehavior{ @Override public void sayHello() { // TODO Auto-generated method stub System.out.println("hey guys"); } } package strategy; //继承人类基类 public class English extends Human{ //英国人掌握了英语技能包 public English() { this.sayHelloBehavior = new SayHelloByEnglish(); } }
定义一个天朝人类和用国语打招呼实现类
package strategy; //实现打招呼接口 public class SayHelloByChinese implements SayHelloBehavior{ @Override public void sayHello() { // TODO Auto-generated method stub System.out.println("泥嚎!"); } } package strategy; //继承人类基类 public class Chinese extends Human { //做为一个国人当然掌握了国语技能包 public Chinese() { this.sayHelloBehavior = new SayHelloByChinese();
测试类
package strategy; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub //创建一个国人xiaoming Human xiaoming = new Chinese(); //小明打招呼 xiaoming.sayHello(); //创建一个英国人james Human james = new English(); //james打招呼 james.sayHello(); //james来到我大天朝学习博大精深的国语。 james.setSayHelloBehavior(new SayHelloByChinese()); //James使用国语打招呼 james.sayHello(); } } 输出 泥嚎! hey guys 泥嚎!
三、在jdk中的应用例子 |
Arrays.sort(Object[] objs,Comparator comparator),通过传入具体的Comparator实例实现不同的排序规则。
定义两个Comparator的实现类
class HumanAgeDescComparator implements Comparator<Human>{ @Override public int compare(Human arg0, Human arg1) { // TODO Auto-generated method stub return arg1.getAge()-arg0.getAge(); } } class HumanNameDescComparator implements Comparator<Human>{ @Override public int compare(Human arg0, Human arg1) { // TODO Auto-generated method stub return arg1.getName().compareTo(arg0.getName()); } }
测试
import java.util.Comparator; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Human xiaoming = new Chinese("xiaoming"); Human james = new English("james"); xiaoming.setAge(10); james.setAge(23); Human[] humanArray = new Human[2]; humanArray[0] = xiaoming; humanArray[1] = james; Arrays.sort(humanArray,new HumanAgeDescComparator()); System.out.println(Arrays.toString(humanArray)); Arrays.sort(humanArray,new HumanNameDescComparator()); System.out.println(Arrays.toString(humanArray)); } }
输出
[james, xiaoming]
[xiaoming, james]