iOS当中的设计模式

  • 代理模式 
    应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。 
    优势:解耦合 
    敏捷原则:开放-封闭原则 
    实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。 
    自定义的delegate

  • 观察者模式 
    应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。 
    优势:解耦合 
    敏捷原则:接口隔离原则,开放-封闭原则 
    实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。 
    kvo,键值对改变通知的观察者。

  • MVC模式 
    应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。 
    优势:使系统,层次清晰,职责分明,易于维护 
    敏捷原则:对扩展开放-对修改封闭 
    实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。如下图所示: 
    MVC

  • 单例模式 
    应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。 
    优势:使用简单,延时求值,易于跨模块 
    敏捷原则:单一职责原则 
    实例:[UIApplication sharedApplication]。 
    注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。 
    Java,C++中使其没有公有构造函数,私有化并覆盖其构造函数。 
    object c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例, 
    返回的也只是此单例类的唯一静态变量。

  • 工厂模式 
    应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。 
    优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。 
    敏捷原则:DIP依赖倒置原则 
    实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换 
    注意:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也很明显,增加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。

  • 策略模式 
    应用场景:定义算法族,封装起来,使他们之间可以相互替换。 
    优势:使算法的变化独立于使用算法的用户 
    敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。 
    注意事项: 
    1,剥离类中易于变化的行为,通过组合的方式嵌入抽象基类 
    2,变化的行为抽象基类为,所有可变变化的父类 
    3,用户类的最终实例,通过注入行为实例的方式,设定易变行为 
    防止了继承行为方式,导致无关行为污染子类。完成了策略封装和可替换性。


    原文点击打开链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#的dllimport使用方法详解

DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL(托管/非托管是微软的.net framework中特有的概念,其中,非托管代码也叫本地(native)代码。与Java中的机制类似&…

each函数循环数据表示列举,列举循环的时候添加dom的方法

var dotBox $(#bannerNum);var item <li></li>;var itemSize $(#bannerBack p).length;var dotBoxWidth itemSize*24;$(#bannerBack p).each(function () { dotBox.append(<li></li>); dotBox.find(li).eq(0).addClass(current);});这里要根…

使用lxml代替beautifulsoup

深入使用过lxml的都会深深地喜欢上它,虽然BeautifulSoup很流行,但是深入了解lxml后,你就再也不会使用bs了 我觉得beautifulsoup不好用,速度也慢(虽然可以使用lxml作为解析器了).另外soup.find_all这种简直就是手工时代的操作(很多人使用find find_all这几个函数, 其实它们使用起…

QT调用dll且进入DLL src code调试

qt应用程序AA.exe调用qt写的BB.DLL时&#xff0c;进入BB.DLL src code调试 1、debug生成AA.exe 2、将debug生成的AA.exe整包debug folder放到BB.dll的debug生成的文件夹中 3、设置BB.dll这个project&#xff1a;项目----运行-----Executable中选择BB.dll的debug文件夹中的AA.ex…

php安装编译时 configure: error: Cannot find OpenSSL's evp.h

yum install error: protected multilib versions errorsudo yum downgrade openssl 降级sudo yum install openssl-devel 另外参考yum install -y ncurses-devel yum install openssl openssl-develyum install openssl openssl-devel --setoptprotected_multilibfalse ln -s …

laravel项目中css样式表的背景图片不显示

刚学laravel&#xff0c;遇到了很多坑&#xff0c;感觉laravel是挺强大的。 建好后台项目&#xff0c;奈何css样式表的背景图片不显示 .mainhd {background: url(../images/sky/body_bg.png) repeat-x 0px 0px; } 按理上面的写法没错&#xff0c;因为是从别的后台搬过来的&…

KVC KVO

1、KVC&#xff0c;即是指 NSKeyValueCoding&#xff0c;一个非正式的Protocol&#xff0c;提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。 Demo&#xff1a; interface myPerson : NSObject { …

VS2010中 C++创建DLL图解

一、DLL的创建 创建项目: Win32->Win32项目&#xff0c;名称&#xff1a;MyDLL 选择DLL (D) ->完成. 1、新建头文件testdll.htestdll.h代码如下&#xff1a;#ifndef TestDll_H_#define TestDll_H_#ifdef MYLIBDLL#define MYLIBDLL extern "C" _declspec(dllimp…

js理解 call( ) | apply( ) | caller( ) | callee( )

被js的这几个方法搞的this晕头转向&#xff0c;下定决心搞清楚&#xff1b;1、call( )和apply( ):两者都可以将函数绑定到另外一个对象上去运行&#xff0c;只是参数的传递方式不同&#xff0c;两者都可以使当前函数拥有另一个对象的属性和方法&#xff0c;实现js下的继承&…

上传SVN丢失.a文件的问题

iOS项目上传到svn中&#xff0c;.a文件丢失 用Cornerstone工具&#xff0c;解决这个问题 1.打开Cornerstone左上角&#xff0c;点Cornerstone->Preferences->Subversion 2.Global lgnores下面有一个Use default global ignores 默认这里方框中会打钩&#xff08;这就是.a…

使用公用表表达式的递归查询

微软从SQL2005起引入了CTE(Common Table Expression)以强化T-SQL。公用表表达式 (CTE) 具有一个重要的长处&#xff0c;那就是可以引用其自身。从而创建递归 CTE。递归 CTE 是一个反复运行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。 当某个查询引用递归 CTE 时…

C#委托实现C++ Dll中的回调函数

from:https://blog.csdn.net/ferrycooper/article/details/63261771很多的Dll都是C和C写的&#xff0c;那么如果C#想要调用Dll中的函数怎么办&#xff0c;尤其是Dll函数其中一个参数是函数指针的&#xff0c;即里面有回掉函数的用C#怎么实现&#xff1f; C中的回掉函数在C#中有…

安装Birt方法

安装BIRT 方法&#xff1a; 博客地址&#xff1a;http://www.mamicode.com/info-detail-850588.html 注意&#xff1a;在 Install new Software 中输入地址&#xff1a;http://download.eclipse.org/birt/update-site/4.2-interim 看好了 出来的四项要全部选中 &#xff0c;然后…

iOS NSString和NSDate转换

后台返回的时间字符串不是标准的时间而是计算机时间的时候&#xff0c;我们需要将它们转换为标准时间&#xff0c;再进行转换。 //字符串转为时间&#xff0c;时间格式自己定 NSString * time "1501776000"; //时间字符串 NSInteger num [time integerValue]; …

15个最好的HTML5前端响应式框架(2014)

文中的多个框架基于SASS创建&#xff0c;SCSS是一种比LESS更简洁的样式表编程语言&#xff0c;它能够编绎成CSS&#xff0c;可复用CSS代码&#xff0c;声明变量&#xff0c;甚至是函数&#xff0c;类Ruby/Python的语法。參见&#xff1a; LESS vs SASS&#xff1f;选择哪种CSS样…

DLL导出类和导出函数

from:https://blog.csdn.net/goodluckmt/article/details/526912971、动态库DLL中的类或者函数有时候要被其他的库调用&#xff0c;因此需要被其他库调用的类或者函数需要进行导出。 2、首先编写需要导出的DLL&#xff0c;新建一个工程设置应用程序类型为DLL3、类的代码如下 头…

Nginx做web服务器linux内核参数优化

Nginx做web服务器linux内核参数优化Nginx提供web服务时Linux内核参数调整是必不可少的&#xff0c;其中在优化方面就需要我们格外的注意。在下面就是对Linux内核参数优化的详细介绍&#xff0c;希望大家有所收获。关于Linux内核参数的优化&#xff1a;net.ipv4.tcp_max_tw_buck…

iOS系统发布时间

发布日期 版本编号 更改2017年9月12日 iOS11 GM seed2017年6月19日 iOS10.3.32016年11月9日 iOS10.2 Beta2 发布iOS10.2测试版版2016年11月1日 iOS10.2 Beta1 发布iOS10.2测试版版2016年10月25日 iOS10.1 发布iOS10.1正式版2016年9月22日 iOS10.1 Beta 发布iOS10.1测试版2016年…

Tomacat服务器的安装和配置

一&#xff0c; Tomcat服务器的下载地址(Apache Tomcat的官网): http://tomcat.apache.org/download-70.cgi 这里为了稳定性安装的版本为7.0. 截止目前版本已经发行到了9.0. 二&#xff0c; 解压下载的压缩包之后直接进入傻瓜式的安装。   下载文件的全名&#xff1a; apach…

函数指针与回调函数详解

函数指针与回调函数详解 1.什么是函数指针&#xff1f; 函数&#xff08;的&#xff09;指针就是指针。这个指针存放一个函数的地址&#xff0c;而函数的名称就该函数的入口&#xff0c;即地址。这类似于数组名就是数组的首地址。我们可以通过反汇编直观的查看到函数名和函数地…