假设这样一个场景:有一个银行,用户可以办理业务,用户身份有普通客户,土豪,和VIP客户,不同的用户有不同的办理业务过程。我们用来模拟一下。
银行:
public class Bank {
//欢迎普通用户
public void welcome(OrdinaryUser user){
user.doSomething();
}
//欢迎土豪用户
public void welcome(RichUser user){
user.doSomething();
}
//欢迎Vip用户
public void welcome(VipUser user){
user.doSomething();
}
}
普通用户:
public class OrdinaryUser {
//普通用户办理业务
public void doSomething(){
System.out.println("普通用户来办理业务了");
System.out.println("普通用户办理业务离开了。。。。。。");
}
}
土豪用户:
public class RichUser {
//土豪办理业务
public void doSomething(){
System.out.println("土豪客户大摇大摆的来办理业务了");
System.out.println("土豪客户办理业务大摇大摆离开了。。。。。。");
}
}
Vip用户:
public class VipUser {
//Vip客户办理业务
public void doSomething(){
System.out.println("Vip客户高调的来办理业务了");
System.out.println("Vip客户办理业务高调离开了。。。。。。");
}
}
测试:
public class TestMain {
public static void main(String[] args) {
Bank bank = new Bank();
OrdinaryUser ordinaryUser = new OrdinaryUser();
RichUser richUser = new RichUser();
VipUser vipUser = new VipUser();
bank.welcome(ordinaryUser);
bank.welcome(richUser);
bank.welcome(vipUser);
}
}
我们发现办理流程不管是什么用户都是办理流程(doSomthing())一样的,可不可以银行办理业务只留一个方法,让不同用户都适用呢,我们想到的是继承一个父类,创建对象的时候让父类引用指向子类,然后可以使用多态效果。
public class Person {
public void doSomething() {
}
}
让三种身份都继承此父类
public class OrdinaryUser extends Person{
//普通用户办理业务
public void doSomething(){
System.out.println("普通用户来办理业务了");
System.out.println("普通用户办理业务离开了。。。。。。");
}
}
public class RichUser extends Person{
//土豪办理业务
public void doSomething(){
System.out.println("土豪客户大摇大摆的来办理业务了");
System.out.println("土豪客户办理业务大摇大摆离开了。。。。。。");
}
}
public class VipUser extends Person{
//Vip客户办理业务
public void doSomething(){
System.out.println("Vip客户高调的来办理业务了");
System.out.println("Vip客户办理业务高调离开了。。。。。。");
}
}
public class Bank {
//欢迎
public void welcome(Person person){
person.doSomething();
}
}
public class TestMain {
public static void main(String[] args) {
Bank bank = new Bank();
Person ordinaryUser = new OrdinaryUser();//父类引用指向子类对象
Person richUser = new RichUser();//父类引用指向子类对象
Person vipUser = new VipUser();//父类引用指向子类对象
bank.welcome(ordinaryUser);
bank.welcome(richUser);
bank.welcome(vipUser);
}
}
这样只使用了一个方法就实现了不同角色的办理业务过程,利用了多态的特点(调用方法时,子类重写了则调用子类的)实现了一个策略模式,每个身份就是相当于一个策略;这就是一个简单的策略模式的思想。