首页 > 代码库 > 设计模式——策略模式

设计模式——策略模式

策略模式定义

        策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。先放一张典型的类图:


图中AlgorithmInterface()就是所谓的算法,StrategyA/B/C都封装实现了。黄色部分是调用!

下面我将从项目经验中,举实例说明一下策略模式。

使用策略模式

项目软件的登录流程。有首次登录、二次登录和短信登录。这三种登录方式流程大致相同,有一些差别。首先说一下相同的地方,比如:

1. 登录前:连接Server,无论那种方式都需要连接服务器。方法名ConnectServer();

2. 登录中:对密码加密算法。方法名:EncryptPWD();

3. 登录后:有一些逻辑操作。方法名:DealwithLoninOK();

但是,登录过程中对密码的操作,三种方式都是不一样的;登录后的一些逻辑操作也是不一样的。按照一般的思维:我们必须在EncryptPWD添加一个switch,区分不同类型登录的逻辑。

使用策略模式的办法是这样的:首先定义一个基类LoginStrategy,定义上面三个接口。

@interface FtLoginStrategy : NSObject
{
   
}
-(void) ConnectServer;
-(void) EncryptPED:(NSString*)pwd;
-(void) DealwithLoginOK;
-(NSString*)loginStrategyType;//用于区分登录类型,基类返回const string即可
@end

从LoginStrategy派生三个类:FirstLoginStrategy,SecondLoginStrategy和SMSLoginStrategy出来。

无论那种登录方式,都是连接同一个服务器。所以ConnectServer()的逻辑是一致的,所以派生类可以不实现ConnectServer()。但是三个派生类需要实现

-(void) EncryptPWD;
-(void) DealwithLoginOK;
那么在调用登录的时候,根据不同的需要你可以这么用了:

LoginStrategy * login = [[FirstLoginStrategy alloc]init];
//LoginStrategy * login = [[SecondLoginStrategy alloc]init];//或者
//LoginStrategy * login = [[SMSLoginStrategy alloc]init];//或者
[login ConnectServer];
[login EncryptPWD:(pwd)];
[login DealwithLoginOK];


策略模式的好处

之前看到很多策略模式的文字都是不错的,但是例子不太好理解。这次把项目中真是的案例写出来。

好处显而易见:假如将来添加一个二维码登录的需求,那么,在目前三种登录代码的基础上,再添加一个类即可。

策略模式还是面向对象思想“继承+多态+封装”的应用,不用设计模式,使用type来区分也能达到目的,不过设计模式让代码更优雅。