前提:我们需要设计一下会飞 会游泳,会叫的模型鸭子或者真实鸭子,也就是可能会有不同的鸭子和鸭子可能会有不同的行为。
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];
本文介绍了一种使用面向对象编程来模拟不同类型的鸭子的方法。通过定义鸭子的基础行为并允许子类根据需要覆盖这些行为,可以灵活地创建多种鸭子类型。这种方式不仅提高了代码的复用性,还简化了新增鸭子种类时的行为定义。
432

被折叠的 条评论
为什么被折叠?



