Head First设计模式—策略模式

来源:互联网 发布:javascript异步编程 编辑:程序博客网 时间:2024/05/20 11:27

这是我自己用Objective-c重写Head-First设计模式中第一章策略模式,直接上代码吧:

FlyBehavior.h fly协议实现:

#import <Foundation/Foundation.h>

@protocol FlyBehavior <NSObject>

- (void)fly;

@end


QuackBehavior.h quack协议实现:

#import <Foundation/Foundation.h>

@protocol QuackBehavior <NSObject>

- (void)quack;

@end

Duck.h  duck头文件:

#import <Foundation/Foundation.h>

#import "FlyBehavior.h"

#import "QuackBehavior.h"

@interface Duck : NSObject{

    id<FlyBehavior> flyBehavior;

    id<QuackBehavior> quackBehavior;

}

- (void)swim;

- (void)display;

- (void)performQuack;

- (void)performFly;

- (void)setFlyBehavior:(id<FlyBehavior>)fb;

- (void)setQuackBehavior:(id<QuackBehavior>)qb;

@end

Duck类的实现:

#import "Duck.h"

@implementation Duck

- (void)swim{

    NSLog(@"I can swimming");

}

- (void)display{

    NSException *myException = [NSException

                                exceptionWithName:@"Method not override exception"

                                reason:@"display method must be override"

                                userInfo:nil];

    @throw myException;

}

- (void)performQuack{

    [quackBehavior quack];

}

- (void)performFly{

    [flyBehavior fly];

}

- (void)setFlyBehavior:(id<FlyBehavior>)fb{

    flyBehavior = fb;

}

- (void)setQuackBehavior:(id<QuackBehavior>)qb{

    quackBehavior = qb;

}

@end

flynoway头文件和实现:

#import <Foundation/Foundation.h>

#import "FlyBehavior.h"

@interface FlyNoWay : NSObject<FlyBehavior>

- (void)fly;

@end


#import "FlyNoWay.h"

@implementation FlyNoWay

- (void)fly{

    NSLog(@"I can't fly");

}

@end


FlyWithWings类头文件和实现:

#import <Foundation/Foundation.h>

#import "FlyBehavior.h"

@interface FlyWithWings : NSObject<FlyBehavior>

- (void)fly;

@end


#import "FlyWithWings.h"

@implementation FlyWithWings

- (void)fly{

    NSLog(@"I'm flying!");

}

@end

FlyRocketPowered类头文件和实现:

#import <Foundation/Foundation.h>

#import "FlyBehavior.h"

@interface FlyRocketPowered : NSObject<FlyBehavior>

- (void)fly;

@end


#import "FlyRocketPowered.h"

@implementation FlyRocketPowered

- (void)fly{

    NSLog(@"I'm flying with a rocket");

}

@end


接下来是遵循QuackBehavior协议的类(实现QuackBehavior接口的类):
MuteQuack类头文件和实现:

#import <Foundation/Foundation.h>

#import "QuackBehavior.h"

@interface MuteQuack : NSObject<QuackBehavior>

- (void)quack;

@end


#import "MuteQuack.h"

@implementation MuteQuack

- (void)quack{

    NSLog(@"MuteQuack");

}

@end


Quack类头文件和实现:

#import <Foundation/Foundation.h>

#import "QuackBehavior.h"

@interface Quack : NSObject<QuackBehavior>

- (void)quack;

@end


#import "Quack.h"

@implementation Quack

- (void)quack{

    NSLog(@"Quack");

}

@end


#import <Foundation/Foundation.h>

#import "QuackBehavior.h"

@interface

#import "Squeack.h"


Squeack类头文件和实现:

@implementation SqueackNSObject<QuackBehavior>

- (void)quack;

@end


#import "Squeack.h"

@implementation Squeack

- (void)quack{

    NSLog(@"Squeack");

}

@end


下面是Duck类的子类。

MallardDuck类头文件和实现:

#import "Duck.h"

@interface MallardDuck : Duck

- (id)init;

- (void)display;

@end


#import "MallardDuck.h"

#import "Quack.h"

#import "FlyWithWings.h"

@implementation MallardDuck

- (id)init{

    if (self = [super init]) {

        quackBehavior = [[Quack allocinit];

        flyBehavior = [[FlyWithWings allocinit];

    }

    return self;

}

- (void)display{

    NSLog(@"I'm a real Mallard duck");

}

@end


ModelDuck类头文件和实现:

#import "Duck.h"

@interface ModelDuck : Duck

- (id)init;

- (void)display;

@end


#import "ModelDuck.h"

#import "FlyNoWay.h"

#import "Quack.h"

@implementation ModelDuck

- (id)init{

    if (self = [super init]) {

        flyBehavior = [[FlyNoWay allocinit];

        quackBehavior = [[Quack allocinit];

    }

    return self;

}

- (void)display{

    NSLog(@"I'm a model duck");

}

@end


主函数:

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

#import "Duck.h"

#import "MallardDuck.h"

#import "ModelDuck.h"

#import "FlyRocketPowered.h"

int main(int argc, char * argv[]) {

    @autoreleasepool {

        Duck *mallard = [[MallardDuck allocinit];

        [mallard performQuack ];

        [mallard performFly ];


        Duck *model = [[ModelDuck allocinit];

        [model performFly];

        [model setFlyBehavior:[[FlyRocketPowered allocinit]];

        [model performFly];

    }

    

    return 0;

}




图片是最后结果,这个实现比较简单,问题不大,有什么关于objective-c的问题,请留言交流。

——Rocky

0 0