IOS基础之 (设计模式)

一 工厂方法

工厂方法方便我们快速创建类的实例的方法。通过工厂方法,可以让调用过程更加清晰。

Person.h

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Person : NSObject
 4 {
 5     int _age;
 6     NSString * _name;
 7 }
 8
 9 - (int)age;
10 - (NSString *) name;
11
12 + (NSString *) personWithAge:(int)age andName:(NSString *) name;
13 - (id) initWithAge:(int)age andName:(NSString*)name;
14
15 @end

Person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (int)age{
 6     return _age;
 7 }
 8
 9 - (NSString *) name{
10     return _name;
11 }
12
13
14 + (NSString *)personWithAge:(int)age andName:(NSString *)name{
15         return [[Person  alloc ]initWithAge:age andName:name ];
16 };
17
18 - (id)initWithAge:(int)age andName:(NSString *)name{
19     self = [super init];
20     if(self != nil){
21         _age = age;
22         _name = name;
23     }
24     return self;
25 }
26
27 - (NSString *)description{
28     return [NSString stringWithFormat: @"人的年龄是%d,名字是%@", self.age, self.name ];
29 }

main.h

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3
 4
 5 int main(int argc, const char * argv[]) {
 6
 7     Person *p1 = [Person personWithAge:20 andName: @"lisi"];
 8     NSLog(@"%@"  , p1);
 9
10     return 0;
11 }

二 代理设计模式

设计原理

有些麻烦的事情不想自己亲自做,就可以找个人帮忙,即交给代理对象去做。

设计原则

首先的拥有某个代理对象属性。其次要很清楚代理有哪些方法。最后要保证能解耦。

实现方案

定义一个protocol,在其中声明一些和代理沟通的方法。

拥有一个代理属性 id<protocol> delegate

让代理遵守protocol.

实例: 保姆与小孩

1.当A对象想监听B对象的一些变化时, 可以使用代理设计模式 保姆想监听婴儿的变化, 那么保姆就可以成为婴儿的代理, 当婴儿发生变化之后保姆就可以监听到.
2.当B对象发生一些事情, 想通知A对象的时候, 可以使用代理设计模式 婴儿想通知保姆, 那么就可以 让保姆成为婴儿的代理, 只要保姆成为婴儿的代理, 以后婴儿发生变化就可以通知保姆.
3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象) 婴儿无法自己吃东西, 也无法自己入睡, 所以可以让保姆帮忙处理. 只要让保姆成为婴儿的代理就可以帮婴儿喂它吃东西和哄他睡觉.

三 delegate模式

IPeople.h

 1 #import <Foundation/Foundation.h>
 2
 3 @protocol IPeople <NSObject>
 4
 5 - (int) age;
 6
 7 - (void)setAge:(int)age;
 8
 9 - (NSString*)name;
10
11 @end

ManDelegate.h

1 #import <Foundation/Foundation.h>
2
3 @protocol ManDelegate <NSObject>
4
5 - (void) onAgeChanged:(int) age;
6
7 @end

Man.h

 1 #import <Foundation/Foundation.h>
 2 #import "IPeople.h"
 3 #import "ManDelegate.h"
 4
 5 @interface Man : NSObject<IPeople>
 6 {
 7     int _age;
 8 }
 9
10 - (id) init;
11
12 - (int) age;
13
14 - (void) setAge:(int)age;
15
16 - (NSString *)name;
17
18 @property id<ManDelegate> delegate;
19
20 @end

Man.m

 1 #import "Man.h"
 2
 3 @implementation Man
 4
 5 - (id)init{
 6     self = [super init];
 7     if( self ){
 8         self.delegate=nil;
 9         _age = 20;
10     }
11
12     return self;
13 }
14
15 - (int) age{
16     return _age ;
17 }
18
19 - (void)setAge:(int)age{
20     if (age != _age) {
21         if(self.delegate){
22             [self.delegate onAgeChanged:age];
23         }
24     }
25
26     _age = age;
27 }
28
29 - (NSString *)name{
30       return @"lisi";
31 }
32
33 @end

Main.m

 1 #import <Foundation/Foundation.h>
 2 #import "Man.h"
 3 #import "ManDelegate.h"
 4
 5 @interface MainListener : NSObject<ManDelegate>
 6    - (void) onAgeChanged:(int) age;
 7 @end
 8
 9 @implementation MainListener
10
11 - (void)onAgeChanged:(int)age{
12     NSLog(@"Age changed, Current age is %d" , age);
13 }
14
15 @end
16
17 int main(int argc, const char * argv[]) {
18     Man *man = [[Man alloc]init];
19    // man.delegate = [[MainListener alloc]init];
20     [man setDelegate: [[MainListener alloc]init]  ];
21
22     //[man setAge:20];
23     [man setAge:21];
24
25     return 0;
26 }

参考资料:

http://www.cnblogs.com/king129/p/4943875.html

时间: 2024-09-30 07:03:57

IOS基础之 (设计模式)的相关文章

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表&quot;练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

iOS开发与设计模式 - MVC

iOS开发与设计模式 - MVC 最近在学习GoF的设计模式这本书,粗略的浏览了一遍,真是好书.好书就应该好好读,因此很有必要从实际的言语.项目理解设计模式. 我是做iOS开发的,自然就从这方面入手(脑). MVC iOS开发最基本的一个模式就是MVC, M指model,V指view,C指controller,有很多文章对它们是什么,它们的关系,它们如何交互进行了详细的说明,本文就不再展开说明了,仅放一张图供大家参考(来自斯坦福大学ios课程)  ViewController 是什么? 在iOS

IOS开发常用设计模式

IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们经常碰到只需要某类一个实例的情况,最常见的莫过于对硬件参数的访问类,比如UIAccelerometer.这个类可以帮助我们获得硬件在各个方向轴上的加速度,但是我们仅仅需要它的一个实例就够了,再多,只会浪费内存. 所以苹果提供了一个UIAccelerometer的实例化方法+sharedAcceler

ios基础-XCode使用技巧

(一)代码规范pragma mark 1.定义 #pragma 开头的代码是一条编译器指令,是一个特定于程序或编译器的指令.不一定适用于其它编译器或其它环境.如果编译器不能识别该指令,则会将其忽略. 2.作用 在编辑器窗格顶部,方法和函数弹出菜单中将代码分隔开,规范化代码,方便阅读查找. 3.使用 在需要加注释的地方加上#pragma mark - #pragma mark - 视图将要显示的时候 - (void)viewWillAppear:(BOOL)animated { //初始化选号的数

iOS 基础函数解析 - Foundation Functions Reference

Foundation Functions Reference Framework Foundation/Foundation.h Declared in NSBundle.h NSByteOrder.h NSDecimal.h NSException.h NSObjCRuntime.h NSObject.h NSPathUtilities.h NSRange.h NSZone.h Overview This chapter describes the functions and function

iOS基础问答面试

<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw>iOS基础问答面试题连载(二)-附答案:http://www.jianshu.com/p/ce50261f8907 <简书社区 — Timhbw>iOS基础问答面试题连载(三)-附答案:http://www.jianshu.com/p/5fd65c20912e 以下是一些自己收集的比较基础的问题(

iOS基础 KVC和KVO

疯狂IOS讲义这本书之前一直一直觉得没什么用,看了做不出像样的程序出来,但是经过几天的学习发现,没有一定的ios基础,做的程序永远都是在模仿他人的程序,把他人的代码复制 粘贴...为什么能够实现?原理 是什么?不懂...所以 必须懂原理,为什么? 接下来就今天所学习的内容做一个小结: 首先介绍一下KVO和KVC,一个是键值编码一个是键值监听,我第一次听这个也是很困惑,这是个神马意思?键值是啥?监听 还懂一点 ... 我们都知道之前我们都是通过setter和getter来设置和修改对象的属性,KV

iOS 基础之—— Properties

一篇关于iOS 编程中 @property 方法中属性的介绍,写的十分简洁明了,原文链接请戳. ===读后分割线==== 在iOS 5之后,有了ARC 的出现,不需要手动进行内存管理,@property 中的属性也有了一些变化. 现在常使用的如下: 属性 功能介绍 getter= 给getter方法一个自定义名称 setter= 给setter方法一个自定义名称 readonly 不生成setter方法 nonatomic 禁止多线程,相较默认的线程保护(atomic)可提高性能 内存管理属性