为什么要用策略模式,魅力所在?
一个场景: 在移动应用开发中,大多数app都会有多种登录方式,如账号登录,第三方登录(qq,新浪,微信等等),通过不同登录方式走不同的流程。 在这里,可能我们会这样实现:
实现代码如下:
public class LoginType {
/*
*对不同的登录方式做不同的功能
*/
public void loginType(String type){
if(type.equals("账号登录")){
doSomething("...账号登录......");
}else if(type.equals("qq登录")){
doSomething("...qq登录......");
}if(type.equals("微信登录")){
doSomething("...微信登录......");
}if(type.equals("微博登录")){
doSomething("...微博登录......");
}
}
public void doSomething(String str){
.......
}
}
这样实现也是可以的,但一旦登录方式修改了,或者新增登录方式,我们就要去修改if-else里面调用的代码。而策略模式就能很好的解决这个问题,下面我们先来认识下策略模式
策略模式(Strategy)属于对象行为型模式,主要针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使得他们可以相互替换。策略模式的本质就是:分离算法,选择实现
策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且在该程序有多种实现方式时使用。
在策略模式中有如下几个对象:
- 环境对象:实现对抽象策略中定义的接口或者抽象类的引用。
- 抽象策略对象:可以由接口或者抽象类来实现。
- 具体策略对象:它封装了实现不同功能的不同算法。
策略模式的结构:
看完了策略模式,我们来看下策略模式的演示代码:
抽象策略对象ILoginType.java代码:
public interface ILoginType {
/*
* 某个算法的接口,可以由传入参数也可以有返回值
*/
void loginType();
}
具体策略对象UserLogin.java,QQLogin.java,WXLogin.java,SinaLogin.java代码:
public class UserLogin implements ILoginType{
@Override
public void loginType() {
// 具体的登录实现
}
}
public class QQLogin implements ILoginType{
@Override
public void loginType() {
// qq登录的具体实现方式
}
}
public class WXLogin implements ILoginType{
@Override
public void loginType() {
// 微信登录的实现
}
}
@Override
public void loginType() {
// 新浪登录方式
}
}
环境对象Context.java代码如下:
public class Context {
private ILoginType loginType;
public Context(ILoginType loginType) {
super();
this.loginType = loginType;
}
public void contextInterface(){
loginType.loginType();
}
}
然后我们测试下:
Client.java:
public class Client {
public static void main(String[] args) {
//ILoginType loginType = new UserLogin();
ILoginType loginType = new QQLogin();
//ILoginType loginType = new WXLogin();
//ILoginType loginType = new SinaLogin();
//Context context = new Context(loginType);
context.contextInterface();
}
}
看了前面的实例,你会发现,每个策略算法的具体实现的功能。就是原来在if -else结构中的具体实现。其实多个if - elseif语句表达的就是一个平等的功能结构,而策略模式就是把各个平等的具体实现封装到单独策略实现类中,然后通过上下文和具体实现策略类进行交互。
如果我们要增加新的登录方式,我们只要写一个实现登录方式的策略方式就行了。然后在客户端Client调用下就行了。
下面我们就来总结下:
何时使用策略模式:
1.1,如果在一个系统里面有许多的类,他们之间的区别仅在于他们的行为,那么使用策略模式就可以动态的让一个对象在许多行为中选择一种行为。
1.2,如果具体算法类都有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并之持有一个数据类型是抽象算法类的对象。
1.3,一个系统的算法使用的数据不可以让客户端知道,策略模式可以避免涉及到不必要接触的复杂和只与算法有关的数据。
1.4,如果一个对象有多种行为,这种行为只能用if -else来实现,此时,使用策略模式就是一种很好的选择。策略模式优缺点:
2.1, 优点:
2.1.1 , 定义一系列的算法,可以相互替换,
2.1.2, 避免多重条件语句,
2.1.3, 更好的扩展性,使新增策略类变得更加简单,
2.2, 缺点:
2.2.1 , 客户必须了解每种策略的不同,客户需要选择哪个策略,这样就要客户了解所有的策略,还要了解各种策略的功能和不同,
2.2.2, 增加了对象数目,由于策略模式把每个具体的策略实现都单独封装成了一个类。
2.2.3, 只使用扁平的算法结构,策略模式的一系列算法是平等的,是可以相互替换的,也就构成一种扁平算法结构,这样就限制了算法使用的层级,使用的时候不能嵌套。好了,今天就学习到这里了。。