策略模式是利用Java面向对象的多态性实现的。
举一个例子来说明策略模式的设计思想。
现有一家银行,办理业务的流程为:叫号,办理业务,离开;服务的客户有三类,老人,年轻人,土豪;这三类客户办理业务的流程都是一样的,但是在具体实现细节上却有差异。当我们在编写代码时,不可能为每一类客户重写一遍代码,这样效率会很低,而且代码冗余会很高。在我们的设想中,应该是用同一套代码,实现不同对象进来时显示出不同的效果,且当对象类型增多时,不需要修改这套流程。
而在Java中,多态性恰好能够实现这样的效果。下面贴代码。
先设计一个抽象类Person类,定义规则(即将业务流程设计成抽象方法)。
package bank;
public abstract class Person {
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
//叫号
public abstract void callNumber();
//办理业务
public abstract void transact();
//离开
public abstract void leave();
}
在分别为老人、年轻人、土豪设计一个类,继承Person类,并实现其中的抽象方法。
package bank;
public class OldMan extends Person{
public OldMan(){}
public OldMan(String name) {
this.setName(name);
}
//叫号
public void callNumber(){
System.out.println("老年人叫号");
}
//办理业务
public void transact(){
System.out.println("老年人办理业务");
}
//离开
public void leave(){
System.out.println("老年人办完业务,离开了");
}
}
package bank;
public class YoungMan extends Person{
public YoungMan(){}
public YoungMan(String name){
this.setName(name);
}
//叫号
public void callNumber() {
System.out.println("年轻人叫号");
}
public void transact() {
System.out.println("年轻人办理业务");
}
public void leave(){
System.out.println("年轻人办完业务离开了");
}
}
--------------------------------------------------------------------
package bank;
public class Toff extends Person{
public Toff(){}
public Toff(String name){
this.setName(name);
}
//叫号
public void callNumber(){
System.out.println("土豪叫号");
}
public void transact(){
System.out.println("土豪办理业务");
}
public void leave(){
System.out.println("土豪办完业务离开了");
}
}
最后,设计出银行类。在该类中,我们传的参数是Person 类,就是在这里利用了Java的多态性。
package bank;
public class Bank {
//开门迎接客户进来办理业务
public void welcome(Person person){
System.out.println("欢迎"+person.getName()+"前来办理业务");
person.callNumber();
person.transact();
person.leave();
}
}
测试类:
package bank;
/**
* 该项目演示多态的用处
*/
public class test {
public static void main(String[] args){
Bank bank = new Bank();
Person p = new Toff("土豪");
//多态中能调用什么方法看new后面的类
bank.welcome(p);
}
}
在测试类中,我们通过使用Java多态性,在定义客户类型时,编译时类型为Person型,运行时类型为实际需要的客户类型。这样在给Bank类传参时,可以通过同一个类型传进去,但是在调用相同的方法时,却会因为子类中重写了该方法而现实子类中的方法,从而实现出我们想要的效果。
策略模式就是这种中间流程都固定,但是涉及到不同对象时,会根据情况进行一个策略选择。