首页 > 代码库 > 设计模式——策略模式
设计模式——策略模式
策略模式定义
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。先放一张典型的类图:
图中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来区分也能达到目的,不过设计模式让代码更优雅。