之前自己敲代码的时候没有特别注意到需要使用什么样的设计模式,敲的代码多了开始想对设计模式有所了解了。于是,在某网上买了本大话设计模式,自己翻着看了。用OC来实现书中的一些设计模式。也算是对 设计模式的一种加深认识吧。话不多说,上代码:
-------工程采用的是MRC模式 ------------ (~ o ~)~zZ
#import <Foundation/Foundation.h>
//采用get set方法初始化参数 这个是工厂的运算类的基类
.h
@interface Operation :NSObject{
NSInteger _numberA;
NSInteger _numberB;
NSInteger _result;
}
- (void)setNumberA:(NSInteger)numberA;
- (void)setNumberB:(NSInteger)numberB;
- (NSInteger)getNumberA;
- (NSInteger)getNumberB;
- (NSInteger)getResult;
@end
.m#import "Operation.h"
@implementation Operation
- (void)setNumberA:(NSInteger)numberA {
if (_numberA!=numberA) {
_numberA = numberA;
}
}
- (void)setNumberB:(NSInteger)numberB {
if (_numberB != numberB) {
_numberB = numberB;
}
}
- (NSInteger)getNumberA {
return_numberA;
}
- (NSInteger)getNumberB {
return_numberB;
}
- (NSInteger)getResult {
NSInteger result =0;
return result;
}
@end
//加法运算 .m
#import "Add.h"
@implementation Add
- (NSInteger)getResult {
[supergetResult];
NSInteger result =0;
result = _numberA +_numberB;
return result;
}
@end
//减法运算 .m
#import "Sub.h"
@implementation Sub
- (NSInteger)getResult {
[supergetResult];
NSInteger result =0;
result = _numberA -_numberB;
return result;
}
@end
//乘法运算.m
#import "Mul.h"
@implementation Mul
- (NSInteger)getResult {
[supergetResult];
NSInteger result =0;
result = _numberA *_numberB;
return result;
}
@end
//除法运算 .m
#import "Div.h"
@implementation Div
- (NSInteger)getResult {
[supergetResult];
NSInteger result =0;
if (_numberB!=0) {
result = _numberA / _numberB;
} else {
assert(@"除数不能为0");
NSLog(@"除数不能为0");
}
return result;
}
@end
好了我们的基类和功能类已经建好了。下面该使用我们的工厂模式了。
.h
//工厂类根据需要创建出所需要的运算类
#import <Foundation/Foundation.h>
@classOperation;
@interface OperationFactory :NSObject
+ (Operation *)createOperate:(NSString *)operate;
@end
#import "OperationFactory.h"
#import "Operation.h"
#import "Add.h"
#import "Sub.h"
#import "Mul.h"
#import "Div.h"
@implementation OperationFactory
+ (Operation *)createOperate:(NSString *)operate{
Operation *oper =nil;
NSInteger i=0;
if ([operateisEqualToString:@"+"]) {
i = 0;
} elseif ([operateisEqualToString:@"-"]){
i = 1;
} elseif([operateisEqualToString:@"*"]){
i = 2;
} elseif ([operateisEqualToString:@"/"]){
i = 3;
}
switch (i) {
case0:
oper = [[[Addalloc]init]autorelease];
break;
case1:
oper = [[[Suballoc]init]autorelease];
break;
case2:
oper = [[[Mulalloc]init]autorelease];
break;
case3:
oper = [[[Divalloc]init]autorelease];
break;
}
return oper;
}
@end
//我们的工厂也建好了。万事俱备只欠使用了。 下面在controller 里操作。
看代码:
.m
#import "ViewController.h"
#import "Operation.h"
#import "OperationFactory.h"
@interfaceViewController ()
@property (nonatomic,retain)Operation *oper;
@property (retain,nonatomic)IBOutletUITextField *numberA;
@property (retain,nonatomic)IBOutletUITextField *operation;
@property (retain,nonatomic)IBOutletUITextField *numberB;
@property (retain,nonatomic)IBOutletUILabel *results;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//根据输入的字符判断需要创建的子类
_numberA.keyboardType =UIKeyboardTypeNumberPad;
_numberB.keyboardType =UIKeyboardTypeNumberPad;
_results.text =@"";
}
- (IBAction)buttonPressAction:(id)sender {
if ([_operation.textisEqualToString:@"/"]&&[_numberB.textintegerValue]==0) {
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:nilmessage:@"除数不能为0"delegate:nilcancelButtonTitle:@"确定"otherButtonTitles:nil,nil];
[alert show];
[alert release];
return;
}
if ([_operation.textisEqualToString:@"+"]||[_operation.textisEqualToString:@"-"]||[_operation.textisEqualToString:@"*"]||[_operation.textisEqualToString:@"/"]) {
_oper = [OperationFactorycreateOperate:_operation.text];
[_opersetNumberA:[_numberA.textintegerValue]];
[_opersetNumberB:[_numberB.textintegerValue]];
_results.text = [NSStringstringWithFormat:@"%ld",[_opergetResult]];
} else {
_results.text =@"对不起,请您输入+ - * /中的任何一个字符";
}
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[_numberArelease];
[_operationrelease];
[_numberBrelease];
[_resultsrelease];
[superdealloc];
}
@end
总结:这样的话只要输入运算符号,工厂就会实例化出合适的对象。通过多态返回父类的方法实现简单的计算机的结果哦。