一 工厂方法

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

Person.h

 #import <Foundation/Foundation.h>

 @interface Person : NSObject
{
int _age;
NSString * _name;
} - (int)age;
- (NSString *) name; + (NSString *) personWithAge:(int)age andName:(NSString *) name;
- (id) initWithAge:(int)age andName:(NSString*)name; @end

Person.m

 #import "Person.h"

 @implementation Person

 - (int)age{
return _age;
} - (NSString *) name{
return _name;
} + (NSString *)personWithAge:(int)age andName:(NSString *)name{
return [[Person alloc ]initWithAge:age andName:name ];
}; - (id)initWithAge:(int)age andName:(NSString *)name{
self = [super init];
if(self != nil){
_age = age;
_name = name;
}
return self;
} - (NSString *)description{
return [NSString stringWithFormat: @"人的年龄是%d,名字是%@", self.age, self.name ];
}

main.h

 #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) { Person *p1 = [Person personWithAge: andName: @"lisi"];
NSLog(@"%@" , p1); return ;
}

二 代理设计模式

设计原理

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

设计原则

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

实现方案

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

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

让代理遵守protocol.

实例: 保姆与小孩

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

三 delegate模式

IPeople.h

 #import <Foundation/Foundation.h>

 @protocol IPeople <NSObject>

 - (int) age;

 - (void)setAge:(int)age;

 - (NSString*)name;

 @end

ManDelegate.h

 #import <Foundation/Foundation.h>

 @protocol ManDelegate <NSObject>

 - (void) onAgeChanged:(int) age;

 @end

Man.h

 #import <Foundation/Foundation.h>
#import "IPeople.h"
#import "ManDelegate.h" @interface Man : NSObject<IPeople>
{
int _age;
} - (id) init; - (int) age; - (void) setAge:(int)age; - (NSString *)name; @property id<ManDelegate> delegate; @end

Man.m

 #import "Man.h"

 @implementation Man

 - (id)init{
self = [super init];
if( self ){
self.delegate=nil;
_age = ;
} return self;
} - (int) age{
return _age ;
} - (void)setAge:(int)age{
if (age != _age) {
if(self.delegate){
[self.delegate onAgeChanged:age];
}
} _age = age;
} - (NSString *)name{
return @"lisi";
} @end

Main.m

 #import <Foundation/Foundation.h>
#import "Man.h"
#import "ManDelegate.h" @interface MainListener : NSObject<ManDelegate>
- (void) onAgeChanged:(int) age;
@end @implementation MainListener - (void)onAgeChanged:(int)age{
NSLog(@"Age changed, Current age is %d" , age);
} @end int main(int argc, const char * argv[]) {
Man *man = [[Man alloc]init];
// man.delegate = [[MainListener alloc]init];
[man setDelegate: [[MainListener alloc]init] ]; //[man setAge:20];
[man setAge:]; return ;
}

参考资料:

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

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

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

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  2. 【iOS 单例设计模式】底层解析与运用

    [iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司   单例实例 - 管理 ...

  3. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  4. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  5. iOS 基础日记-修饰符

    今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...

  6. iOS基础问答面试

    <简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...

  7. iOS常用的设计模式

    iOS常用的设计模式有:单例模式.委托模式.观察者模式和MVC模式.下面分别简单介绍. 一:单例模式 我们常用的UIApplication.NSUserdefaults.NSNotificationC ...

  8. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

  9. iOS 基础:Frames、Bounds 和 CGGeometry

    https://segmentfault.com/a/1190000004695617 原文:<iOS Fundamentals: Frames, Bounds, and CGGeometry& ...

随机推荐

  1. Repeater——数据库控件学习

    1.Repeater控件的使用:(用于重复加载一些内容,把要重复加载的代码写在ItemTemplate里面) 脱完控件后,在设计视图中配置数据源即可~ 2.ListView(数据显示,分页此控件一拖千 ...

  2. Collection中list集合的应用常见的方法

    集合 : 用存放对象的容器(集合)     Collection : 跟接口 : 单列集合          ---> List :有序的 ,元素是可以重复的.          ---> ...

  3. python环境搭建-设置PyCharm软件的配色方案和Python解释器

    设置PyCharm软件的配色方案 设置Python解释器(用于Python2 or 3 的切换)

  4. wsdl中含ref="s:schema"时处理的

    dos窗口,在生成客户端代码的时候,出现了下图所示的错误: java是通过JAXB解析wsdl文件的,出现这种错误的原因是: 是JAXB目前还不支持ref 这种元素的解析 s:schema是types ...

  5. Oracle Temp表空间切换

    来源于:  http://www.2cto.com/database/201507/418564.html 一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时 ...

  6. ClipDrawable 实现图片渐变现实

    clip.xml <?xml version="1.0" encoding="utf-8"?><clip xmlns:android=&quo ...

  7. 【BZOJ 1177】【APIO 2009】Oil

    http://www.lydsy.com/JudgeOnline/problem.php?id=1177 前缀和优化,时间复杂度$O(nm)$ 因为数据不全,快速读入会导致RE,切记! #includ ...

  8. hdu 2069 限制个数的母函数(普通型)

    Coin Change Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. Shiro 学习笔记(一)——shiro简介

    Apache Shiro 是一个安全框架.说白了,就是进行一下 权限校验,判断下这个用户是否登录了,是否有权限去做这件事情. Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与web 集成. ...

  10. native2ascii 国际资源文件编码

    将common_zh_CN.properties 转换为 本地文件 common_zh_CN_src.properties native2ascii -reverse common_zh_CN.pro ...