一 工厂方法

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

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. Scala入门之控制结构

    package com.dtspark.scala.basics /** * Scala中的基本控制结构有顺序.条件和循环三种方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控制结 ...

  2. ALinq Dynamic 使用指南——慨述(上)

    一.使用 1.程序集与命名空间的引用使用 ALinq Dynamic,你需要引用ALinq.Dynamic.dll(ALinq用户)或者System.Data.Linq.Dynamic.dll (Li ...

  3. “奥特曼攻打小怪兽”java学习打怪升级第一步

    ---恢复内容开始--- 练习:回合制对战游戏:奥特曼和小怪兽进行PK,直到一方的血量为0时结束战斗,输出谁胜利了! 不难看出场景中有两个对象:”奥特曼“这一对象抽象为”Ao"类:     ...

  4. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  5. MVC 中的 ispostback

    总之呢就是在MVC中试下 ispostback那种效果, 环境就是:登录验证loinger, if (Request.HttpMethod == "POST"){} 没理解透彻 源 ...

  6. C# EventHandler and Delegate(委托的使用)

    委托的声明 public delegate void MyDelegate(string str); 注 1.委托的定义和方法的定义类似,只是在前面加了一个delegate,但委托不是方法,它是一种特 ...

  7. android Baseadapter 和 ViewHolder的使用

    昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...

  8. window 系统设置无线wifi

    netsh wlan set hostednetwork mode=allow ssid=huage key=243573295 如上表示设置成功 然后继续输入 netsh wlan start ho ...

  9. SELinux关闭和开启

    检测Selinux状态 ./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 SELinux status: enabled .geten ...

  10. win10下安装Ubuntu出现win10无法进入的情况

    昨天晚上在win10上安装Ubuntu Kylin16.04系统,结果发现重启的时候进不去windows系统了,而且报的错误是 /EndEntire file path: /ACPI(a0341d,0 ...