swift - 使用加密类快速实现 SOLID 原则
问题描述
我正在阅读类设计的 SOLID 原则,并想使用一个简单的加密类来测试一些东西。下面是我想出的。基本上,我想创建一个加密器类,它需要输入一个字符串和要使用的加密方法。我想出了以下内容,但我不太喜欢如何传递特定 Caesar 类的实例。如果有另一种加密方法,但使用不同的 init,会发生什么?您能否告诉我在保持代码简洁、灵活和满足 SOLID 原则的同时实现这一目标的最佳方法?非常感谢您的帮助。谢谢你。
更新:我确实理解我为 Caesar 所做的实现并不强大,需要对其进行改进。但是,在这个阶段,我更关心的是解决方案设计。
import Foundation
protocol Encryptor{
func encrypt(st:String)->String
func decrypt(st:String)->String
}
class Encrypt {
var str: String
var encryptedstr: String?
var encryptionMethod:Encryptor
var decryptedString:String?
init(strtoEncrypt:String, encryptionMethod:Encryptor){
self.str = strtoEncrypt
self.encryptionMethod = encryptionMethod
}
func encrypt(){
print("encrypted original string \(str)....")
self.encryptedstr = encryptionMethod.encrypt(st: self.str)
print("the encrypted string is \(encryptedstr ?? "" )")
}
func decrypt(){
self.decryptedString = encryptionMethod.decrypt(st: self.encryptedstr!)
print("the decrypted string is \(decryptedString ?? "") ")
}
}
class Caesar:Encryptor{
let shift: Int
init(shiftValue: Int){
self.shift = shiftValue
}
func encrypt(st:String)->String{
var encryptedStr = ""
for char in st.utf8{
let shiftedChar = Int(char)+shift
let encryptedChar = Character(UnicodeScalar(shiftedChar)!)
encryptedStr = encryptedStr + String(encryptedChar)
}
return encryptedStr
}
func decrypt(st:String)->String{
var decryptedString = ""
for char in st.utf8{
let shiftedChar = Int(char)-shift
let decryptedChar = Character(UnicodeScalar(shiftedChar)!)
decryptedString = decryptedString + String(decryptedChar)
}
return decryptedString
}
}
let caesar = Caesar(shiftValue: 1)
let enc = Encrypt(strtoEncrypt: "test is the best", encryptionMethod:caesar)
enc.encrypt()
enc.decrypt()
解决方案
推荐阅读
- docker - Docker 映像构建失败并显示“复制失败:未指定源文件”
- c - 16 字节 UUID 的“伪”哈希
- python - 我想构建一个小型数据分析仪表板,我的方法是否正确?
- scala - 如何获得字符串匹配的行数并将其添加为 Scala 中的新列?
- reactjs - 如何在 React Word Web 加载项中路由?
- python - 将 RTCM 校正数据注入 GPS M8P 模块
- asp.net-mvc - 使用 ADO.net 在 asp.net mvc 中添加搜索功能
- android - 从 xml 字符串中获取带有动态变量的字符串
- common-lisp - 声明一个可选函数
- angular - 如何使用 Spring Boot 项目在 Angular 中管理登录会话?