大话设计模式之初见(一)

    

       之前自己敲代码的时候没有特别注意到需要使用什么样的设计模式,敲的代码多了开始想对设计模式有所了解了。于是,在某网上买了本大话设计模式,自己翻着看了。用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


.m

#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

总结:这样的话只要输入运算符号,工厂就会实例化出合适的对象。通过多态返回父类的方法实现简单的计算机的结果哦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值