一 工厂方法

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

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. 2016年1月25日 《1024伐木累》-小白篇之开发网站,三天!(中篇-2奇怪的IE)-总章节十一

    往期回顾:  老王的“先见之明”,解决了困扰耗仔三人的大难题.顺利安装完开发工具,大家投入紧张的工作.航空部领导的突然闯入,IE不兼容,页面错乱,摆在三人面前的形势依然严峻.第一次见这阵仗的耗仔,又会 ...

  2. apache配置虚拟主机

    步骤如下: 1.在配置文件httpd.conf中启用httpd-vhosts.conf 找到# Virtual hosts将Include conf/extra/httpd-vhosts.conf前的 ...

  3. 关于安装Visual Studio 2015 RC版卡主不动的解决方案

    在官方网站下载了vs_community.exe自动下载安装的软件进行安装,安装到github时候 卡了1个小时 一直显示正在获取,遂感觉不大对劲,使用了FQ程序,过了2分钟果然正常获取安装,进入了下 ...

  4. jquery+bootstrap使用数字增减按钮

    <div class="container"> <div class="page-header"><h1>Bootstrap ...

  5. webpack入坑之旅(四)扬帆起航

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  6. 配置163Yum源自动判断你的系统是Centos版本(适用于5.x或6.x)

    #!/bin/bash #Author:nulige #Date: 2015-3-8 #实现功能:自动判断你的系统是Centos版本,适用于5.x或6.x mv /etc/yum.repos.d/Ce ...

  7. RabbitMQ 主题(Topic)

    我们进步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fanout那样,只能够无脑的转发. 虽然使用direct类型改良了我们的系统,但是仍然存在一 ...

  8. 开发错误11:Configuration with name ‘default’ not found

    开发错误11:Configuration with name 'default' not found 今天在导入一个sdkdemoapp3.0项目时,发现project build.gradle 与m ...

  9. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...

  10. 【BZOJ 4104】【Thu Summer Camp 2015】解密运算

    http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...