您的位置:首页 > 其它

策略设计模式

2016-09-25 23:07 323 查看
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。

先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜 

三个锦囊妙计是同一个东西,需要写一个协议

IStrategy.h

#import <Foundation/Foundation.h>

// 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口

@protocol IStrategy <NSObject>

// 每个锦囊妙计都是一个可执行的算法

@required

-(void)operate;

@end

在写三个实现这个协议的类,多少个锦囊妙计就多少个类

BackDoor:

//找乔国老帮忙,使孙权不能杀刘备

#import <Foundation/Foundation.h>

#import "IStrategy.h"

@interface BackDoor : NSObject<IStrategy>

@end

@implementation BackDoor

 -(void)operate

{

   
NSLog(@"找乔国老帮忙,让吴国太给孙权施加压力");

}

GivenGreenLight

#import <Foundation/Foundation.h>

#import "IStrategy.h"

//求吴国太开个绿灯

@interface GivenGreenLight :
NSObject<IStrategy>

@end

@implementation GivenGreenLight

-(void)operate

{

    NSLog(@"求吴国太开个绿灯,放行!");

}

@end

BlockEnemy:

#import <Foundation/Foundation.h>

#import "IStrategy.h"

//孙夫人断后,挡住追兵

@interface BlockEnemy :
NSObject<IStrategy>

@end

@implementation BlockEnemy

-(void)operate

{

    NSLog(@"孙夫人断后,挡住追兵");

}

@end

需要用锦囊来存放妙计

Context.h:

//计谋有了,那还要有锦囊

#import <Foundation/Foundation.h>

#import "IStrategy.h"

@interface Context : NSObject

/**

 *  构造函数看我要使用哪个妙计

 *

 *  @param straegy <#straegy description#>

 *

 *  @return <#return value description#>

 */

-(instancetype)initWithObject:(id<IStrategy>)straegy;

/**

 *  使用计谋了,看我出招了

 */

-(void)operate;

@end
Context.m:

#import "Context.h"

@interface Context()

@property(nonatomic,strong)id<IStrategy>
straegy;

@end

@implementation Context

-(instancetype)initWithObject:(id<IStrategy>)straegy

{

   if(self = [superinit])

   {

       self.straegy = straegy;

   }

    return self;

}

/**

 *  使用妙计

 */

 -(void)operate

{

    [self.straegyoperate];

}

@end

@interface Context()

@property(nonatomic,strong)id<IStrategy>
straegy;

@end

@implementation Context

-(instancetype)initWithObject:(id<IStrategy>)straegy

{

   if(self = [superinit])

   {

       self.straegy = straegy;

   }

    return self;

}

/**

 *  使用妙计

 */

 -(void)operate

{

    [self.straegyoperate];

}

@end

然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅: 

ZhaoYun.h:

#import <Foundation/Foundation.h>

@interface ZhaoYun : NSObject

/**

 *  赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计

 *

 *  @return <#return value description#>

 */

-(void)excute;

@end
ZhaoYun.m

#import "ZhaoYun.h"

#import "Context.h"

#import "BackDoor.h"

#import "GivenGreenLight.h"

#import "BlockEnemy.h"

@interface ZhaoYun()

@property(nonatomic,strong)Context
*context;

@end

@implementation ZhaoYun

-(void)excute

{

    NSLog(@"-----------刚刚到吴国的时候拆第一个-------------");

    BackDoor *dool = [[BackDooralloc]init];

    self.context = [[Contextalloc]initWithObject:dool];

    [self.contextoperate];//使用计策

    NSLog(@"\n\n\n\n");

    

    NSLog(@"-----------刘备乐不思蜀了,拆第二个了-------------");

    GivenGreenLight *green = [[GivenGreenLightalloc]init];

    self.context = [[Contextalloc]initWithObject:green];

    [self.contextoperate];//使用计策

    NSLog(@"\n\n\n\n");

    

    

    NSLog(@"-----------孙权的小兵追了,咋办?拆第三个-------------");

    BlockEnemy *block = [[BlockEnemyalloc]init];

    self.context = [[Contextalloc]initWithObject:block];

    [self.contextoperate];//孙夫人退兵

    NSLog(@"\n\n\n\n");

    

   
//就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了,还有一个就是扩展性,也就是
OCP原则,策略类可以继续增加下去

    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式