IOS基础之 (设计模式)
一 工厂方法
工厂方法方便我们快速创建类的实例的方法。通过工厂方法,可以让调用过程更加清晰。
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基础之 (设计模式)的更多相关文章
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- 【iOS 单例设计模式】底层解析与运用
[iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司 单例实例 - 管理 ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- iOS 基础日记-修饰符
今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...
- iOS基础问答面试
<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...
- iOS常用的设计模式
iOS常用的设计模式有:单例模式.委托模式.观察者模式和MVC模式.下面分别简单介绍. 一:单例模式 我们常用的UIApplication.NSUserdefaults.NSNotificationC ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
- iOS 基础:Frames、Bounds 和 CGGeometry
https://segmentfault.com/a/1190000004695617 原文:<iOS Fundamentals: Frames, Bounds, and CGGeometry& ...
随机推荐
- 2016年1月25日 《1024伐木累》-小白篇之开发网站,三天!(中篇-2奇怪的IE)-总章节十一
往期回顾: 老王的“先见之明”,解决了困扰耗仔三人的大难题.顺利安装完开发工具,大家投入紧张的工作.航空部领导的突然闯入,IE不兼容,页面错乱,摆在三人面前的形势依然严峻.第一次见这阵仗的耗仔,又会 ...
- apache配置虚拟主机
步骤如下: 1.在配置文件httpd.conf中启用httpd-vhosts.conf 找到# Virtual hosts将Include conf/extra/httpd-vhosts.conf前的 ...
- 关于安装Visual Studio 2015 RC版卡主不动的解决方案
在官方网站下载了vs_community.exe自动下载安装的软件进行安装,安装到github时候 卡了1个小时 一直显示正在获取,遂感觉不大对劲,使用了FQ程序,过了2分钟果然正常获取安装,进入了下 ...
- jquery+bootstrap使用数字增减按钮
<div class="container"> <div class="page-header"><h1>Bootstrap ...
- webpack入坑之旅(四)扬帆起航
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- 配置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 ...
- RabbitMQ 主题(Topic)
我们进步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fanout那样,只能够无脑的转发. 虽然使用direct类型改良了我们的系统,但是仍然存在一 ...
- 开发错误11:Configuration with name ‘default’ not found
开发错误11:Configuration with name 'default' not found 今天在导入一个sdkdemoapp3.0项目时,发现project build.gradle 与m ...
- 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)
排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...
- 【BZOJ 4104】【Thu Summer Camp 2015】解密运算
http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...