ios客户端学习笔记(三):学习Swift的设计模式

news/2024/11/19 4:46:56/

设计模式是指在软件开发中常用的一些解决问题的方法和思想,它可以帮助你更好地组织代码和提高代码的可维护性。你需要学习常见的设计模式,如MVC、MVVM、单例模式、工厂模式等,在开发应用程序时应用它们。

当你学习常见的设计模式时,可以参考以下设计模式的定义和具体实例:

1. MVC模式(Model-View-Controller)

MVC模式是一种常用的设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理数据和业务逻辑,视图负责显示数据和用户交互,控制器负责协调模型和视图之间的交互。

MVC(Model-View-Controller)模式示例代码:

// Model
class User {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}
}// View
class UserView {func displayUser(user: User) {print("Name: \(user.name), Age: \(user.age)")}
}// Controller
class UserController {let user: Userlet userView: UserViewinit(user: User, userView: UserView) {self.user = userself.userView = userView}func updateUser(name: String, age: Int) {user.name = nameuser.age = ageuserView.displayUser(user: user)}
}// Usage
let user = User(name: "John", age: 30)
let userView = UserView()
let userController = UserController(user: user, userView: userView)userController.updateUser(name: "Jane", age: 25)

具体实例:在iOS开发中,你可以使用MVC模式来构建应用程序的数据模型和逻辑结构。比如,在一个简单的计算器应用程序中,你可以使用MVC模式将计算逻辑放在模型中,将显示逻辑放在视图中,将用户交互放在控制器中。

以下是一个简单的计算器应用程序的MVC模式代码示例:

// Model
class Calculator {var result: Double = 0func add(number1: Double, number2: Double) {result = number1 + number2}func subtract(number1: Double, number2: Double) {result = number1 - number2}func multiply(number1: Double, number2: Double) {result = number1 * number2}func divide(number1: Double, number2: Double) {if number2 != 0 {result = number1 / number2} else {result = 0}}
}// View
class CalculatorView {func displayResult(result: Double) {print("Result: \(result)")}
}// Controller
class CalculatorController {let calculator: Calculatorlet calculatorView: CalculatorViewinit(calculator: Calculator, calculatorView: CalculatorView) {self.calculator = calculatorself.calculatorView = calculatorView}func add(number1: Double, number2: Double) {calculator.add(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}func subtract(number1: Double, number2: Double) {calculator.subtract(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}func multiply(number1: Double, number2: Double) {calculator.multiply(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}func divide(number1: Double, number2: Double) {calculator.divide(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}
}// Usage
let calculator = Calculator()
let calculatorView = CalculatorView()
let calculatorController = CalculatorController(calculator: calculator, calculatorView: calculatorView)calculatorController.add(number1: 10, number2: 5) // Output: Result: 15.0
calculatorController.subtract(number1: 10, number2: 5) // Output: Result: 5.0
calculatorController.multiply(number1: 10, number2: 5) // Output: Result: 50.0
calculatorController.divide(number1: 10, number2: 0) // Output: Result: 0.0

2. MVVM模式(Model-View-ViewModel)

MVVM模式是一种基于MVC模式的设计模式,它将视图和模型之间的交互通过ViewModel来实现,解耦了视图和模型之间的依赖关系。ViewModel负责处理视图和模型之间的交互,将模型转换为视图可以使用的数据格式。

MVVM(Model-View-ViewModel)模式示例代码:

// Model
class User {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}
}// View
class UserView {var viewModel: UserViewModelfunc displayUser() {print("Name: \(viewModel.name), Age: \(viewModel.age)")}
}// ViewModel
class UserViewModel {var user: Uservar name: String {return user.name}var age: Int {return user.age}init(user: User) {self.user = user}func updateUser(name: String, age: Int) {user.name = nameuser.age = age}
}// Usage
let user = User(name: "John", age: 30)
let userViewModel = UserViewModel(user: user)
let userView = UserView(viewModel: userViewModel)userViewModel.updateUser(name: "Jane", age: 25)
userView.displayUser()

具体实例:在iOS开发中,你可以使用MVVM模式来构建应用程序的数据模型和逻辑结构。比如,在一个简单的天气应用程序中,你可以使用MVVM模式将天气数据放在模型中,将天气显示逻辑放在视图中,将天气数据的转换逻辑放在ViewModel中。

以下是一个简单的天气应用程序的MVVM模式代码示例:

// Model
struct Weather {let temperature: Doublelet description: String
}// View
class WeatherView {var weatherViewModel: WeatherViewModel? {didSet {updateUI()}}func updateUI() {guard let viewModel = weatherViewModel else {return}print("Temperature: \(viewModel.temperature)°C")print("Description: \(viewModel.description)")}
}// ViewModel
class WeatherViewModel {let weather: Weathervar temperature: String {return String(format: "%.1f", weather.temperature)}var description: String {return weather.description}init(weather: Weather) {self.weather = weather}
}// Usage
let weather = Weather(temperature: 27.5, description: "Sunny")
let weatherViewModel = WeatherViewModel(weather: weather)
let weatherView = WeatherView()weatherView.weatherViewModel = weatherViewModel // Output: Temperature: 27.5°C, Description: Sunny

3. 单例模式(Singleton)

单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。单例模式可以避免多个实例之间的冲突和资源浪费。

单例模式示例代码:

class Singleton {static let shared = Singleton()private init() {}func doSomething() {print("Doing something")}
}// Usage
Singleton.shared.doSomething()

具体实例:在iOS开发中,你可以使用单例模式来管理应用程序的全局状态和资源。比如,你可以使用单例模式来管理应用程序的网络连接、数据库连接等全局资源。

以下是一个使用单例模式来管理应用程序的网络连接的完整代码实例:

// NetworkManager Singleton
class NetworkManager {static let shared = NetworkManager()private init() {// Initialize network manager}func makeRequest(url: String, completion: @escaping (Data?, Error?) -> Void) {guard let url = URL(string: url) else {completion(nil, NSError(domain: "Invalid URL", code: 0, userInfo: nil))return}let task = URLSession.shared.dataTask(with: url) { (data, response, error) incompletion(data, error)}task.resume()}
}// Usage
NetworkManager.shared.makeRequest(url: "https://example.com") { (data, error) inif let error = error {print("Error: \(error.localizedDescription)")return}guard let data = data else {print("Error: No data received")return}let responseString = String(data: data, encoding: .utf8)print("Response: \(responseString ?? "")")
}

在这个例子中,我们创建了一个NetworkManager单例类,它有一个makeRequest方法,用于发起网络请求,并在请求完成后调用回调函数。我们在makeRequest方法中使用了URLSession来发起网络请求。我们可以通过调用NetworkManager.shared来获取NetworkManager单例的实例,并使用makeRequest方法来发起网络请求。

4. 工厂模式(Factory)

工厂模式是一种常用的设计模式,它将对象的创建和使用分离开来,通过一个工厂类来创建对象。工厂模式可以避免对象的创建和使用之间的耦合,提高代码的可维护性和可扩展性。
具体实例:在iOS开发中,你可以使用工厂模式来创建和管理应用程序中的对象。比如,你可以使用工厂模式来创建和管理应用程序的数据访问对象、网络请求对象等。

工厂模式示例代码:

// Product
protocol Animal {func makeSound()
}// Concrete Products
class Dog: Animal {func makeSound() {print("Woof!")}
}class Cat: Animal {func makeSound() {print("Meow!")}
}// Factory
class AnimalFactory {func createAnimal(type: String) -> Animal? {switch type {case "dog":return Dog()case "cat":return Cat()default:return nil}}
}// Usage
let animalFactory = AnimalFactory()if let dog = animalFactory.createAnimal(type: "dog") {dog.makeSound()
}if let cat = animalFactory.createAnimal(type: "cat") {cat.makeSound()
}

具体实例:在iOS开发中,你可以使用工厂模式来创建和管理应用程序中的对象。比如,你可以使用工厂模式来创建和管理应用程序的数据访问对象、网络请求对象等。

以下是一个使用工厂模式来创建和管理应用程序的数据访问对象的完整代码示例:

// DataAccessFactory Protocol
protocol DataAccessFactory {func createDataAccess() -> DataAccess
}// DataAccess Protocol
protocol DataAccess {func getData() -> [String: Any]?func saveData(data: [String: Any])
}// CoreDataAccess Factory
class CoreDataAccessFactory: DataAccessFactory {func createDataAccess() -> DataAccess {return CoreDataAccess()}
}// CoreDataAccess Class
class CoreDataAccess: DataAccess {func getData() -> [String: Any]? {// Fetch data from Core Data// ...return nil}func saveData(data: [String: Any]) {// Save data to Core Data// ...}
}// Usage
let dataAccessFactory: DataAccessFactory = CoreDataAccessFactory()
let dataAccess = dataAccessFactory.createDataAccess()
let data = dataAccess.getData()
dataAccess.saveData(data: ["key": "value"])

在这个例子中,我们定义了一个DataAccessFactory协议和一个DataAccess协议,分别用于定义数据访问对象的工厂和接口。然后,我们实现了一个CoreDataAccessFactory工厂类,用于创建CoreDataAccess数据访问对象。CoreDataAccess实现了DataAccess接口,它可以从Core Data中获取数据并将数据保存到Core Data中。我们可以通过调用CoreDataAccessFactorycreateDataAccess方法来获取CoreDataAccess对象的实例,并使用getDatasaveData方法来获取和保存数据。这种方式可以使我们在不改变业务逻辑的情况下,轻松地更改数据访问对象的实现方式。


http://www.ppmy.cn/news/51037.html

相关文章

线程常用方法

线程常用方法 setName() //设置线程名称,使之与参数name相同getName() //返回该线程的名称start() //使该线程开始执行;Java虚拟机底层调用该线程的start0方法run() //调用线程对象run方法;setPriority() //更改线程的优先级getPrio…

Utilities非默认目录构建和安装

在AppArmor零知识学习八、源码构建(5)中,详细介绍了Utilities的构建步骤,但那完全使用的是官网给出的默认参数。如果需要将目标文件生成到指定目录而非默认的/usr,则需要进行一些修改,本文就来详述如何进行…

gitee教程精简版

$ git config --global user.name "Your Name" $ git config --global user.email "emailexample.com" 设置名字和邮箱 初始化 git init git add test.txt 将文件预先添加到git仓库 git commit -m "刚刚我创建了一个文本"提交给git仓库&#x…

MySQL学习笔记第三天

第04章 运算符 1.算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加()、减(-)、乘(*)、除(/)和取模&a…

S32k3系列开发学习(FlexCAN)

前言 由于之前没有接触过CAN总线模块,对这一块的知识仍比较陌生,于是乎想简单梳理一下CAN总线的工作流程,加深理解。 一、CAN是什么? 参考:https://zhuanlan.zhihu.com/p/346696648 二、CAN框架 各模块功能如下&am…

【vue3学习系列】对比vue2生命周期做了哪些改变,vue3初学者快来看看

文章目录 前言官方生命周期图分析去除beforeCreate与createdsetup代替created其他钩子只是改了名称 剔除vue2后的生命周期图其他钩子函数keepalive错误捕获其他的一些钩子去官方文档看看即可 前言 看了下官方的生命周期的说明,感觉讲的不算太清晰,所以个…

Verilog阻塞与非阻塞赋值详解

基本概念 关于阻塞赋值&#xff08;&#xff09;和非阻塞赋值&#xff08;<&#xff09;&#xff0c; 阻塞赋值&#xff08;&#xff09;是顺序敏感的&#xff0c;非阻塞赋值&#xff08;<&#xff09;是顺序独立的。阻塞赋值按它们在程序块中列出的顺序顺序执行。当它们…

太阳能电池IV测试软件的主要功能,太阳能电池特性测试

太阳能电池测试软件是一种专门用于测试太阳能电池的软件。太阳能电池是一种能够将太阳能转化为电能的装置&#xff0c;它的性能直接影响到太阳能电池发电系统的效率和稳定性。因此&#xff0c;太阳能电池测试软件的开发和使用对于太阳能电池行业的发展具有非常重要的意义。 一、…