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& ...
随机推荐
- Scala入门之控制结构
package com.dtspark.scala.basics /** * Scala中的基本控制结构有顺序.条件和循环三种方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控制结 ...
- ALinq Dynamic 使用指南——慨述(上)
一.使用 1.程序集与命名空间的引用使用 ALinq Dynamic,你需要引用ALinq.Dynamic.dll(ALinq用户)或者System.Data.Linq.Dynamic.dll (Li ...
- “奥特曼攻打小怪兽”java学习打怪升级第一步
---恢复内容开始--- 练习:回合制对战游戏:奥特曼和小怪兽进行PK,直到一方的血量为0时结束战斗,输出谁胜利了! 不难看出场景中有两个对象:”奥特曼“这一对象抽象为”Ao"类: ...
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---
- MVC 中的 ispostback
总之呢就是在MVC中试下 ispostback那种效果, 环境就是:登录验证loinger, if (Request.HttpMethod == "POST"){} 没理解透彻 源 ...
- C# EventHandler and Delegate(委托的使用)
委托的声明 public delegate void MyDelegate(string str); 注 1.委托的定义和方法的定义类似,只是在前面加了一个delegate,但委托不是方法,它是一种特 ...
- android Baseadapter 和 ViewHolder的使用
昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...
- window 系统设置无线wifi
netsh wlan set hostednetwork mode=allow ssid=huage key=243573295 如上表示设置成功 然后继续输入 netsh wlan start ho ...
- SELinux关闭和开启
检测Selinux状态 ./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 SELinux status: enabled .geten ...
- win10下安装Ubuntu出现win10无法进入的情况
昨天晚上在win10上安装Ubuntu Kylin16.04系统,结果发现重启的时候进不去windows系统了,而且报的错误是 /EndEntire file path: /ACPI(a0341d,0 ...