工程案例,设计模式——策略模式

来源:互联网 发布:linux认证等级 编辑:程序博客网 时间:2024/06/05 06:56

策略模式定义

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


图中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来区分也能达到目的,不过设计模式让代码更优雅。

可否使用状态模式

在做登录设计的时候,考虑过使用状态模式。状态模式的类图跟策略模式是一样的,说明他们本质上是一样的,但是使用场景不一样。

状态模式注重内部状态的改变、更新。使用过程中可能从StatusA-->StatusB-->StatusC-->StutasA.这样的改变,表现比较“动态”,策略模式表现则比较“静态”。

后来,根据登录的特性,每个状态也要还要区分“短信登录”、“首次登录”和“二次登录”等,采用策略模式,将步骤流程写死到策略中。如果中间出问题,则会从头开始执行,这样就不存在状态的切换了。

4 0