Objective C 语言 设计模式重构案例

Objective-C阿木 发布于 2025-06-29 7 次阅读


摘要:设计模式是软件工程中解决常见问题的通用解决方案。本文以Objective-C语言为例,通过一个实际案例,展示如何运用设计模式进行代码重构,提高代码的可读性、可维护性和可扩展性。

一、

随着移动应用的不断发展,Objective-C语言在iOS开发中占据着重要地位。在实际开发过程中,我们经常会遇到一些重复性问题,这些问题可以通过设计模式来解决。本文将通过一个实际案例,展示如何运用设计模式进行Objective-C语言的代码重构。

二、案例背景

假设我们正在开发一个iOS应用,其中有一个功能是用户登录。在原始代码中,登录逻辑被直接写在ViewController中,导致代码结构混乱,可读性差,且难以维护。

三、原始代码分析

objective-c

@interface ViewController : UIViewController

@property (nonatomic, strong) IBOutlet UIButton loginButton;

@end

@implementation ViewController

- (void)viewDidLoad {


[super viewDidLoad];



_loginButton.addTarget(self, action:@selector(loginAction), forControlEvents:UIControlEventTouchUpInside);


}

- (void)loginAction {


// 登录逻辑


NSString username = @"user";


NSString password = @"password";



// 模拟登录过程


if ([username isEqualToString:@"user"] && [password isEqualToString:@"password"]) {


NSLog(@"登录成功");


} else {


NSLog(@"登录失败");


}


}

@end


四、设计模式选择

针对上述案例,我们可以选择以下设计模式进行重构:

1. 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。

2. 观察者模式(Observer):当一个对象的状态发生变化时,自动通知所有依赖于它的对象。

3. 命令模式(Command):将请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求。

五、代码重构

1. 单例模式

objective-c

@interface LoginManager : NSObject

+ (instancetype)sharedInstance;

@end

@implementation LoginManager

+ (instancetype)sharedInstance {


static LoginManager instance = nil;


static dispatch_once_t onceToken;


dispatch_once(&onceToken, ^{


instance = [[self alloc] init];


});


return instance;


}

- (void)loginWithUsername:(NSString )username password:(NSString )password {


// 登录逻辑


if ([username isEqualToString:@"user"] && [password isEqualToString:@"password"]) {


NSLog(@"登录成功");


} else {


NSLog(@"登录失败");


}


}

@end


2. 观察者模式

objective-c

@interface LoginObserver : NSObject

@property (nonatomic, weak) id<LoginObserverDelegate> delegate;

@end

@implementation LoginObserver

- (void)loginSuccess {


if ([self.delegate respondsToSelector:@selector(loginSuccess:)]) {


[self.delegate loginSuccess:@"登录成功"];


}


}

- (void)loginFailure {


if ([self.delegate respondsToSelector:@selector(loginFailure:)]) {


[self.delegate loginFailure:@"登录失败"];


}


}

@end

@protocol LoginObserverDelegate <NSObject>

- (void)loginSuccess:(NSString )message;


- (void)loginFailure:(NSString )message;

@end


3. 命令模式

objective-c

@interface LoginCommand : NSObject

@property (nonatomic, weak) id<LoginObserver> observer;

@end

@implementation LoginCommand

- (instancetype)initWithObserver:(id<LoginObserver>)observer {


self = [super init];


if (self) {


_observer = observer;


}


return self;


}

- (void)executeWithUsername:(NSString )username password:(NSString )password {


// 登录逻辑


if ([username isEqualToString:@"user"] && [password isEqualToString:@"password"]) {


[_observer loginSuccess:@"登录成功"];


} else {


[_observer loginFailure:@"登录失败"];


}


}

@end


六、重构后的代码

objective-c

@interface ViewController : UIViewController

@property (nonatomic, strong) IBOutlet UIButton loginButton;

@end

@implementation ViewController

- (void)viewDidLoad {


[super viewDidLoad];



_loginButton.addTarget(self, action:@selector(loginAction), forControlEvents:UIControlEventTouchUpInside);


}

- (void)loginAction {


// 创建单例对象


LoginManager loginManager = [LoginManager sharedInstance];



// 创建观察者对象


LoginObserver observer = [[LoginObserver alloc] init];


observer.delegate = self;



// 创建命令对象


LoginCommand command = [[LoginCommand alloc] initWithObserver:observer];



// 执行登录操作


[command executeWithUsername:@"user" password:@"password"];


}

- (void)loginSuccess:(NSString )message {


NSLog(@"%@", message);


}

- (void)loginFailure:(NSString )message {


NSLog(@"%@", message);


}

@end


七、总结

通过运用设计模式进行代码重构,我们提高了代码的可读性、可维护性和可扩展性。在实际开发过程中,我们应该根据具体需求选择合适的设计模式,以提高代码质量。