Tag: 设计模式

Swift World:设计模式-工厂方法

您还记得我们在上一篇文章中讨论的简单工厂模式吗? 如图所示,我们建立了一家工厂来生产不同类型的汽车。 但是,如果列表太长怎么办。 现在,我们有卡车,跑车,公共汽车等。所有汽车都将在一个工厂内生产。 这将使工厂压力很大。 因此,我们将介绍另一种模式的“工厂方法”来提供帮助。 由于工厂对生产如此多的汽车感到压力很大,为什么不建更多的工厂呢? 好主意,那就是我们将使用Factory Method模式进行的操作。 我们将为每种类型建立工厂,以使他们保持专注。 这些工厂具有相同的界面,因为它们都生产汽车。 然后让我们更改代码。 /// abstract factory protocol Factory { func produce () -> Car } /// concrete factory class SedanFactory : Factory { func produce () -> Car { return Sedan () } } /// concrete factory class SUVFactory : Factory { func produce () -> […]

建筑设计模式:立面

最终绕过了另一种设计模式,即立面。 这一点很有意义,因为我们正在当前的项目中使用它。 我认为我一直在使用的NasaAPOD应用程序不是使用Facade的一个很好的例子,因为Facade应该是在简单的API后面隐藏系统的复杂性。 该应用程序已经非常简单,因此外观根本不复杂。 但是,如果我要充分利用外观模式,则ApiFacade.swift文件还将存储和从CoreData中获取,而不是每次都从API中获取。 这是获取功能差异的一些伪代码。 ///当前执行 func fetchPhotoInfo(完成:@escaping([NasaPhotoInfo])->无效{ //从api获取照片 } ///实现充分利用外观的实现 func fetchPhotoInfo(完成:@escaping([NasaPhotoInfo])->无效{ //检查照片是否在核心数据中 //如果包含核心数据,则返回照片 //从api获取照片 //将照片存储在核心数据中 //返回照片 } 同样,自从经历了这种外观体系结构以来,我对Codable进行了更多的工作,并且意识到如果我使用它而不是做下面的混乱,我可以清理我的代码。 总结起来,这是一个非常容易实现的模式。 就像我之前说的那样,由于该应用程序没有复杂的API,因此其当前功能并未真正很好地展示出外观模式。 我可能会在应用程序上进行扩展以存储到CoreData中以进一步展示它,但我会在一个单独的分支中进行此操作,因为我不想在其余现有应用程序中设置CoreData。 ashleyng /建筑设计模式 通过在GitHub上创建一个帐户,为ashleyng / ArchitectureDesignPatterns开发做出贡献。 github.com Swift World:设计模式-外立面 从字面上看,立面意味着 medium.com 到复杂子系统的更简单接口。 Swift的设计模式:立面模式 外墙图案是结构图案之一。 它的主要目的是隐藏系统,类或…的复杂性。 wysockikamil.com 隐藏系统,类或逻辑的复杂性,并在简单的界面后面提供所有功能。

Swift:委托示例

implementอย่างการ工具代表แบบง่ายๆในภาษาswift iOSารเขียนโปรแกรมบนiOSมีการใช้代理模式เยอะมากซึ่งมันก็คือ设计模式iOSนiOSตัวอย่างที่คนเขียนiOSต้องคุ้นเคยก็เช่นการใช้TableViewเมื่อเคยชินกับ模式นี้แล้วอยากจะมาลองสร้าง协议implement ก็ไม่ยาก 1,制定协议 Classยนแยกใส่ไฟล์(.swift)หรือเขียนใน类ที่จะเรียกใช้代表ก็ได้✅ 协议messageSenderDelegate { func receiveMessage(消息:字符串) } 2.声明您要呼叫的代表 ับเก็บร้างตัวแปรสำหรับเก็บ类(引用类型)ที่เป็น代表มารอไว้ var委托:DownloaderDelegate! =无 3,在类方法中使用委托 @IBAction func sendMessageButtonWasTapped(sender:UIBarButtonItem){ 委托!.receivedMessage(消息:文本) } 4,在接收类中采用messageSenderDelegate协议 类ViewController:UIViewController,messageSenderDelegate { 5,实现委托方法 func receiveMessage(message:String){ 打印(留言) } 6.最后,设置发送班级的代表 จะ设置ที่代表类หรือ发送类ก็ได้ในที่นี้จะ设置ที่代表 类重写func viewDidLoad(){ super.viewDidLoad() SendingVC = Storyboard?.instantiateViewController(withIdentifier:“ titleView”)为! 发送VC SendingVC.delegate =自我 }

Swift中的Singleton类

Singleton是一种在开发中非常流行的设计模式。 大多数开发人员正在使用这种设计模式。 这非常简单,通用并且易于在您的项目中使用。 它仅使用静态属性一次性初始化您的类实例,它将在全局范围内共享您的类实例。 我们已经使用了很多次Apple的Foundation API,例如– UserDefaults .standard , FileManager .default 。 类似于单例类模式。 这里是使用类的一个简单示例 类LocationManager { // MARK:-位置权限 func requestForLocation (){ //代码处理 打印 (“已授予位置”) } } //访问类 let location = LocationManager () //初始化类 位置。 requestForLocation () //在此处调用函数 这是一个没有单例模式的类,用于访问每次我们需要初始化该类的函数,以避免出现这种情况,我们将单例类与静态实例一起使用。

Swift World:设计模式-简单工厂

如果我们想学习一种编程语言,我们需要忍受它。 这意味着尽可能多地使用Swift。 今天,我们将开始讨论Swift中的设计模式。 除了简单的解释之外,我们还尝试提供图形,样本,用例等。让我们开始吧。 第一种模式是简单工厂。 简单地说,我们建立了一个工厂来生产属于同一类型的不同对象。 如下图和代码所示,我们有不同类型的汽车,轿车,SUV和面包车。 它们都符合协议Car。 这意味着该协议定义了汽车的通用接口。 特定的汽车类型会实现自己的逻辑。 class Factory { static func produceCar (type: CarType ) -> Car { switch type { case . sedan: return Sedan () case .SUV : return SUV () } } } let sedan = Factory.produceCar (type: . sedan) sedan .drive () let suv = Factory.produceCar (type: […]

Swift Universe中的迭代器设计模式

(本文最初是用俄语撰写的,并在此处发布。) 迭代器是设计模式之一,通常不为程序员所注意,因为其实现细节通常嵌入在编程语言的标准库中。 但是,它也是四人帮经典著作“设计模式:可重用的面向对象软件的元素”中描述的行为模式之一。 它的理解永远不会被淘汰,甚至可能会有所帮助。 迭代器是一种提供对复合对象的所有元素(通常是容器类型,例如数组和集合)的串行访问的方法。 语言内置资源 创建一个数组: 让numbersArray = [0,1,2] …并循环遍历: 代表numbersArray { 打印(数量) } ……这是很常见的事情,尤其是对于像Swift这样的现代编程语言而言。 但是,此功能由实现Iterator设计模式基础的代码支持。 在Swift中,一种类型必须符合Sequence协议才能被for循环迭代。 除其他事项外,此协议要求具有关联的Iterator类型(必须符合IteratorProtocol )并实现结构方法makeIterator() (此类型返回此类型的特定迭代器): 协议序列{ relatedtype Iterator:IteratorProtocol func makeIterator()-> Self.Iterator //另一个要求在这里… } IteratorProtocol包含唯一的方法— next() ,该方法按顺序返回以下对象: 协议IteratorProtocol { 关联类型元素 变异func next()-> Self.Element吗? } 感觉好像很多复杂的代码,但实际上并非如此。 我们将在一段时间后确定。 例如, Array转换为Sequence (虽然不是直接,但通过协议继承链: MutableCollection继承自Collection ,而Collection继承自Sequence ),这就是为什么可以通过for循环来标识其实例的原因。 用户类型 如果我们的类型必须是可迭代的,我们该怎么办? 像往常一样,显示示例更容易。 让我们定义用于存储书本的书架的类型: 结构书{ 让作者:字符串 让标题:字符串 } […]

Swift 4中的抽象工厂模式

Abstract Factory提供了一个用于创建相关或相关对象族的接口,而无需指定其具体类。 工厂可以生产不同类型的产品。 抽象工厂创建不同类型的工厂。 类型:创作模式 也称为:套件 结构体: 参加者: AbstractFactory:声明用于创建抽象产品对象的操作的接口。 ConcreteFactory:实现创建具体产品对象的操作。 AbstractProduct:声明一种产品对象的接口。 ConcreteProduct:定义要由相应的混凝土工厂创建的产品对象。 补充AbstractProduct接口。 客户端:仅使用AbstractFactory和AbstractProduct类声明的接口。 Swift 4实现: 这是《四人帮》一书中给出的示例WidgetFatory的实现。 我不会详细描述以下代码片段。 我假设您已经具有抽象工厂设计模式的先验知识。 根据类图,有两种抽象产品… 对于一个抽象产品,将有混凝土产品,而有两个混凝土工厂。 抽象工厂: 根据分类图,有两个混凝土工厂。 在这里,我们的客户是GUIBuilder.swift 。 根据抽象工厂模式,客户将仅使用抽象工厂和产品类。 客户不必担心它从抽象工厂得到的具体产品。 客户用途: 您可以在此处找到完整的源代码:Github

MVVM-1:一般性讨论

哦,我的……我们今天所拥有的……另一个关于MVVM的博客。 有什么新鲜事,否则它会讲同样无聊的事情。 是的,那么一件事是,我们的旅程将是漫长而冒险的,并且会围绕MVVM公园进行详细的游览。 我们不仅会学习基础知识,甚至还会尝试使用复杂UI的实时应用程序场景。 让我们继续进行MVVM冒险.. !!!! 听起来有点有趣;)。 是不是 MVVM或模型—视图— ViewModel是一种设计模式,旨在模块化您的代码并将其构建在测试驱动开发环境中。 当苹果公司的传统MVC设计模式使我们的控制器笨重且单元测试痛苦时,诸如MVVM,VIPER,MVP等不同的设计模式便应运而生。 MVVM非常方便,因为它在所有组件之间提供了松散耦合的机制,将您的视图,业务和数据逻辑隔离开来。 有很多教程和博客对此进行了解释,但是在这里,我们将遵循MVVM的基本规则,并学习如何尊重它们并编写漂亮的代码。 我们将分两部分讨论MVVM: 第-1部分讨论了有关MVVM和小型演示代码的大量讨论。 第2部分 将通过一个复杂的UI示例来处理MVVM中一些常见的漏洞,以及解决这些漏洞的方法。 你会学到什么? 我们将在示例的第-1部分中学习以下内容 什么是MVVM? 为什么选择MVVM? 我们将构建一个示例示例。 MVVM的一些缺点。 什么是MVVM? 模型: 模型基本上是应用程序具有的数据模型或实体。 它们只是具有简单关联属性的结构或类。 通常,它们只是保存从原始数据结构映射的数据,这些数据可能来自您的API或其他来源(例如SQLite文件等)。 查看或查看控制器: 视图是显示的视觉元素。 应用程序屏幕上的所有UI组件都是视图。 该视图仅包含UI逻辑,例如数据渲染,导航等。 该视图拥有视图模型。 查看模型: 视图模型接收UI事件并执行业务逻辑,并提供要在UI上显示的输出。 这是负责处理驱动视图的业务逻辑的组件。 但是它在内部不会修改UI,也没有对视图的引用。 它拥有数据模型。 为什么选择MVVM? 好的,我们当中有些人可能会问,当苹果公司提供了美观且更简单的MVC时,为什么还要使用MVVM。 我们可以集成一些不同的设计架构,例如Facade,Coordinator,Singleton等,以构建模块化代码。 好的,现在有以下三个原因使MVVM脱颖而出: 隔离代码:隔离代码 。 基于MVVM组件将特定的视图处理划分为跨视图,模型和视图模型的部分,从而为我们提供了模块化的代码结构。 避免使用笨拙的控制器:使用MVC的开发人员知道,当我们的应用程序可扩展且需求不断与我们现有的逻辑混乱时,我们的控制器将继续扩展,直到并且除非将控制器代码路由到单独的文件中。 通过MVVM,我们在视图模型中写下了业务逻辑,仅将输出传递给视图或控制器。 测试驱动开发 : 最重要的是,MVVM确实提供了执行TDD的良好平台。 我们可以写下用于视图模型的单元测试用例,并测试驱动UI的业务逻辑。 单元测试用例在开发时确实非常重要,因为它们在很大程度上减少了我们的破码机会。 请点击以下链接在iOS中探索有关TDD的更多信息 iOS中的测试驱动开发,SWIFT 4-第1部分 […]

Swift-MVVM Mimari Deseni

MVC’iduymuşsundur,bildiğinüzeregünümüzdefarklıplatformlardaoldukçayaygınkullanılanmimari deseni。 Peki ya MVVM desem? Buyazıda,模型视图控制器(MVC)和iOS模型视图大规模(iri / hantal)diyeadlandırdığımız模型(Massive)-ViewController’ı(M-VC)elealıyoruz。 Yazılankodlarıntest edilmesi konusundakarşılaşılanproblemleriçözmekiçin模型-视图-视图模型(MVVM)mimarisine nedenihtiyaçduyduğumuzuve bu mimariyinasılkullanacağımızimbir projeüzerinden。 İlginiçektiyse,Başlayalım。 模型视图控制器,模型视图控制器(.NET,Swift,Java,Obj-C)库兰尼兰(Kullanılanoldukça)yaygınbir mimaridir。 MVC mimarisinintasarımamacı, geliştiricilerinuygulamaarayüzlerinihedef projeye kolaycauygulamasıvekullanıcıyasunulanarayüzile verilerin birbirindenayrılmasıdiyebiliriz。 标准模型视图控制器: MVC deseni 3 Katmandan -layer / component-oluşur,bunlar: 型号: Gorevi uygulamatarafındankullanılanverilerinsaklanmasıdır。 控制器tarafındanverilerinokunmasınavegüncellenmesineolanaksağlar。 Tek birsınıftanveya birbirleriyleilişkilisınıflartopluluğundanoluşur。 视图: Göreviverileri okuyupsunmaktır。 查看katmanı,儿子kullanıcınıngördüğüveetkileşimhalindeolduğugörselbilesenleriyönetensınıfveyasınıflarbutunudur。 负责人: Model ve View,负责人,kullanıcıgirdileriniyönetir,负责人Model -i ve -gerektigi taktirde- View’igüncellemektensorumludur。 逻辑网络的连接是控制者,她的控制者是她的管理员,而管理员则是其他人。 […]

Swift解决方案:Flyweight模式

Swift Solutions是涵盖设计模式的一系列文章。 在每篇文章中,我们讨论该模式是什么,何时应用以及如何以Swifty方式实现它。 飞量模式是一种节省内存的模式,当有许多要实例化的对象共享相似性时使用。 在本文中,我们将说明并编写Swift中的flyweight模式。 阅读本文之后,您将知道在必须创建大量相关对象时如何节省内存。 插图 首先,让我们使用文本编辑器的经典示例。 文本编辑器实例化并重复使用所有26个字母。 例如,当键入“ HELLO WORLD”时,我们将在三个不同的时间重新创建“ L”字符。 这很浪费,因为我们创建了三个字符对象来表示相同的字母。 flyweight模式的目标是共享可重用的对象,而不是不必要地复制它们,从而使我们的文本编辑器轻巧。 我们通过首先将对象分为两部分来重用对象:外部状态和内部状态。 外在的是指对象的根据上下文而改变的部分,因此无法共享。 例如,一个字符可能被加粗,着色或具有较大的字体大小。 这类数据不可重用,因为我们不希望给定字符的所有实例都共享这些属性。 另一方面,固有数据表示跨字符保持相同的内容。 固有数据的一个示例是给定字符的形状。 所有重复的字符都是渲染的形状,并且该形状不会从一次出现更改为下一次出现。 每当角色出现在我们的整个作品中时,我们都可以使用相同的“ L”形,然后对其应用外在属性。 总结一下: 内部数据是不可变的,相同的,没有上下文的,因此可以重用。 外在数据是可变的和上下文的,因此,并非在所有情况下都可以重用。 通过分离内部数据和外部数据,我们能够确定我们可以在对象中重用的内容。 考虑到这一点,让我们跳入代码示例。 实作 我们将在我们的代码中模拟一支装满步兵的军队。 我们还可以有弓箭手,将军和许多其他类型的士兵,并且我们想尽可能地重复使用,因为这些士兵实体中的每一个都会大量存在。 protocol Soldier { func render(from location: CGPoint, to newLocation: CGPoint) } 首先,我们创建一个Soldier协议,该协议具有将士兵在网格上的原始位置以及士兵将要移动到的新位置的功能。 我们代码的目标是随着战斗的进行在网格上绘制步兵部队。 由于每个士兵都有一个唯一的位置,因此位置被认为是外部状态。 Flyweight对象不会存储位置,但是它们仍需要通过其功能输入来处理外部数据。 不久之后会更多。 飞行重量 让我们看看Flyweight对象的外观: class Infantry: Soldier { private […]