head first 读书笔记:策略模式(针对接口编程,而不是针对实现编程)

本文介绍了一种使用面向对象编程来模拟不同类型的鸭子的方法。通过定义鸭子的基础行为并允许子类根据需要覆盖这些行为,可以灵活地创建多种鸭子类型。这种方式不仅提高了代码的复用性,还简化了新增鸭子种类时的行为定义。

前提:我们需要设计一下会飞 会游泳,会叫的模型鸭子或者真实鸭子,也就是可能会有不同的鸭子和鸭子可能会有不同的行为。

1.假如我们只设计了一个鸭子对象,实现了所有方法,其他所有鸭子都继承这个鸭子对象,当需要增加鸭子的行为的时候就直接从父类增加行为就可以了。这样就会出现的问题是:不是所有的鸭子都有相同的行为的,比如有些能飞,有些不能飞。这怎么办?没事,在子类重写方法(继承),针对不同鸭子实现不同行为就可以了。那这样,到时候一百个鸭子,或者更多鸭子不是要重写一百遍或者更多遍?这样就会让维护和继承变得更复杂了。

2.上面那样设计是不完善的。所以我们需要把行为抽取出来,搞成一个接口,让某些鸭子实现这些接口(一些鸭子会飞,一些鸭子会叫)。如果这样,虽然哪些行为接口解决了一部分问题,例如会飞的橡皮鸭之类的,但是这样就造成了代码无法复用了,假如出现了会飞的鸭子当中有很多飞行动作的话,到时候就修改更加麻烦了。显然,这也是行不通的。

所以,我们要把问题归零,找出应用中尽可能需要变化之处,把他们独立出来,不要和那些不要变化的在一起。把会变化的封装起来,好让他不影响到其他部分。我们可以设计一个鸭子父类,和行为父类。这样就针对接口编程,而不是针对实现编程了。然后我们针对鸭子接口去增加不用的鸭子(用display方法),针对不同的行为,就用不同的行为接口,例如FlyBehavior或者QuackBehavior。鸭子类就不用需要知道行为的实现细节了。那我们在鸭子类实现一个display方法,和 加入 行为的实例变量就可以了。行为父类就声明各种不同的行为就可以了。

好了,其实我也不知道自己在说什么,写博客写的乱七八糟的,还是直接上代码吧。(ios)


duck父类:


@interface LCLDuck :NSObject



//swim action

- (void)swim;


//display action

- (void)display;



- (void)performFlyBehavior;

- (void)performQuackBehavior;



- (void)setFlyBehaviors:(LCLFlyBahavior *)flyBehaviors;

- (void)setQuackBehaviors:(LCLQuackBahavior *)quackBehaviors;



@end


//swim action

- (void)swim{


    NSLog(@"all duck can swim");

}


//display action

- (void)display{


    NSLog(@"all duck display");

    

}



- (void)performFlyBehavior{


    if (self.flyBehavior) {

        [self.flyBehaviorfly];

    }else{

        NSLog(@"all duck no fly behavior");

    }

}


- (void)performQuackBehavior{


    if (self.quackBehavior) {

        [self.quackBehaviorquack];

    }else{

        NSLog(@"all duck no quack behavior");

    }

}



- (void)setFlyBehaviors:(LCLFlyBahavior *)flyBehaviors{


    if (self.flyBehavior) {

        [self.flyBehaviorrelease];

    }


    self.flyBehavior = flyBehaviors;

}

- (void)setQuackBehaviors:(LCLQuackBahavior *)quackBehaviors{


    if (self.quackBehavior) {

        [self.quackBehaviorrelease];

    }

    

    self.quackBehavior = quackBehaviors;

}



行为父类


@interface LCLFlyBahavior :NSObject


//fly action

- (void)fly;


@end


@implementation LCLFlyBahavior



- (void)dealloc{


    


    [superdealloc];

}


//fly action

- (void)fly{


    

}


@end


@interface LCLQuackBahavior :NSObject


//quack action

- (void)quack;



@end


@implementation LCLQuackBahavior



- (void)dealloc{

    

    

    [superdealloc];

}



//quack action

- (void)quack{


    

}


@end



具体实现


@interface LCLModuleDuck :LCLDuck


@end


@implementation LCLModuleDuck



- (void)display{



    NSLog(@"i am a module duck");

}


@end


@interface LCLCanFly :LCLFlyBahavior


@end


@implementation LCLCanFly


- (void)fly{

    

    NSLog(@"i can fly");

}


@end


@interface LCLNoFly :LCLFlyBahavior


@end


@implementation LCLNoFly


- (void)fly{

    

    NSLog(@"i can not fly");

}


@end


@interface LCLCanQuack :LCLQuackBahavior


@end


@implementation LCLCanQuack


- (void)quack{


    NSLog(@"i can quack");

}


@end


@interface LCLNoQuack :LCLQuackBahavior


@end


@implementation LCLNoQuack


- (void)quack{

    

    NSLog(@"i can not quack");

}


@end



引用


    LCLModuleDuck *duck = [[LCLModuleDuckalloc]init];

    [duck display]; //我是模型鸭

    [duck swim];   //所有鸭子都会游泳

    

    [duck performFlyBehavior];   //没设置行为不能飞

    [duck performQuackBehavior];  //没设置行为不能叫

    

    LCLCanFly *canfly = [[LCLCanFly alloc]init];

    [duck setFlyBehaviors:canfly]; //会飞

    [canfly release];

    

    LCLNoQuack *noquack = [[LCLNoQuack alloc]init];

    [duck setQuackBehaviors:noquack];  //不能叫

    [noquack release];

    

    [duck performFlyBehavior];  //我会飞啦

    [duck performQuackBehavior]; //我不能叫哦


    [duck release];



初学,有问题大家一起研究。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值