设计模式适配场景

设计模式适配场景

设计模式共有23种,根据目的准则分类,分为三大类、、
创建型设计模式 / 结构性设计模式 / 行为型设计模式
  • 创建型设计模式 5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式

  • 结构型设计模式 7种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式

  • 行为型设计模式 11种:策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式,解释器模式、、

接下来都将使用 kotlin做演示

一 大类:创建型设计模式
  1. 单例模式

单例的创建方式有很多种,不管是ios 或 android,但是我们要的是结果而不是你会很多种(最终的结果是相同的,所以没有意义,有的只是扯淡浪费时间罢了),我只要你那一种

Ktlin 中 Object 创建的类就是单例
  1. 简单工厂模式 & 抽象类工厂模式
  • 抽象类
open class Computer {}
  • 具体产品类
class AppleComputer: Computer(){

}
  • 工厂类
abstract class Computer {
    open fun start(){
        println(" 原始型号计算机正在启动..")
    }
    enum class CType{
        apple,
        huawei,
        sanxing,
        huipu,
        huasuo
    }
}

class  AppleComputer:Computer(){
    override fun start() {
        println("苹果XX型号计算机正在启动..")
    }
}

class HuaweiComputer:Computer() {
    override fun start() {
        println("华为XX型号计算机正在启动..")
    }
}

class ComputerFactory {
    companion object {
        val createComputer = { what:Computer.CType ->
            when(what){
                Computer.CType.apple -> AppleComputer()
                Computer.CType.huawei -> HuaweiComputer()
                Computer.CType.sanxing -> TODO()
                Computer.CType.huipu -> TODO()
                Computer.CType.huasuo -> TODO()
            }

        }
    }
}
  1. 建造者模式 + 代理模式
// 1. 创建产品原型类
class ComputerCore(var coreCPU:String = "",var coreMainBoard:String = "",var coreRam:String = "") {
   init{
}
}

// 2. 创建Builder类,规范产品的组建
interface BuilderCore {
    fun buildCPU(cpu:String)
    fun buildMainboard(board:String)
    fun buildRam(ram:String)
    fun create():ComputerCore
}

// 3.创建 MoonComputerBuilder 用于生产计算机
class MoonComputerBuilder:BuilderCore {
    private  val computer = ComputerCore()
    override fun buildCPU(cpu: String) {
        computer.mCpu = cpu
    }

    override fun buildMainboard(board: String) {
        computer.mBoard = board
    }

    override fun buildRam(ram: String) {
        computer.coreRam = ram
    }

    override fun create(): ComputerCore {
        return computer
    }
}

// 4. 用集成类统一组装过程
class CombineCore(val build:BuilderCore) {
    var mBuild:BuilderCore? = null
    init {
        mBuild = build
    }
    fun CombineComputer(core:ComputerCore):ComputerCore? {
        mBuild.let {
            it?.buildCPU(core.mCpu)
            it?.buildMainboard(core.mBoard)
            it?.buildRam(core.mRam)
            return it?.create()
        }
    }
}

// 5. 客户端持有组装好的计算机
class HoldComputer {

    companion object {
        // 这里的build只需要创建一次可以复用
        val mBuilder = MoonComputerBuilder()
        fun hold(cpu: String,board: String,ram: String):ComputerCore?{
            // 生产同一种类型的产物只需要一条产线就可以了
            val core = ComputerCore(cpu,board,ram)
            val computer = CombineCore(mBuilder).CombineComputer(core)
            return computer
        }
    }
}

// 6. 使用
fun HoldMainActivity(){
    val computer = HoldComputer.hold("M2","apple mac pro","samsung")
}
  1. 动态代理设计模式
// 1.创建代理实现类
interface Shop {
    fun buy()
}

class Hong:Shop {
    override fun buy() {
        println("我就不买...")
    }
}
// 2.动态代理实现类
class DynamicPurchasing(obj:Any? = null):InvocationHandler {

    var obj:Any?

    init {
        this.obj = obj
    }

    override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any {

        val result = method?.invoke(obj,args)
        if (method?.name == "buy") {
            println("买买买...")
        }
        result.let {
            return it!!
        }
    }
}

class ClientToBuy {
    val hong = Hong()
    val dynamicProxy = DynamicPurchasing(hong)
    val loader:ClassLoader = hong.javaClass.classLoader
    val what = (Proxy.newProxyInstance(loader, arrayOf(Shop::class.java),dynamicProxy) as Shop).buy()
}
  1. 装饰设计模式 (动态扩展一个对象的能力,是继承的替代方案之一)
// 1. 抽象组件
abstract class KungfuModel {
    abstract fun attacMagic()
}

// 2. 组件具体实现类
class JasonStatham:KungfuModel(){
    override fun attacMagic() {
        println("这位硬汉貌似很能啊...")
    }
}

// 3. 抽象装饰者 (大师需要了解杰森斯坦森)
abstract class MasterOf(jason:JasonStatham? = null):KungfuModel(){
    private  var jason:JasonStatham? = null
    init {
        this.jason = jason
    }

    override fun attacMagic() {
        jason?.attacMagic()
    }
}

// 4. 装饰着的具体实现(史泰龙是功夫大师)
class Stallone(kungfu:KungfuModel):MasterOf(jason = kungfu as JasonStatham){
    var kungFu:KungfuModel? = null

    init {
        this.kungFu = kungfu
    }

    fun teachAttackMagic(){
        println("史泰龙教你打飞机..")
        println("杰森斯坦森学会了打飞机")
    }
    override fun attacMagic() {
        super.attacMagic()
        teachAttackMagic()
    }
}

class JetLi(kungfu: KungfuModel):MasterOf(jason = kungfu as JasonStatham){
    var kungfu:KungfuModel? = null
    init {
        this.kungfu = kungfu
    }

    fun teachAttackMagic(){
        println("李连杰教你九阳神功..")
        println("杰森斯坦森学会了九阳神功")
        println("此后打飞机更厉害了,哈哈哈")
    }

    override fun attacMagic() {
        super.attacMagic()
        teachAttackMagic()
    }
}

// 5. 客户端调用

class ClientOfHong {
    // 创建杰森斯坦森
    val jason = JasonStatham()
    // 史泰龙传授杰森打飞机的技巧
    val stallone = Stallone(jason).let {
        it.attacMagic()
    }
    // 李连杰传授杰森九阳神功,避免玩得太虚了
    var jetLi = JetLi(jason).let {
        it.attacMagic()
    }
}
  • 6.外观设计模式 (以掌握的技能做推导)
// UI系统、语言系统、网络系统
class TechnologyForUI{
    fun masteringTechnologyForUIKit(){
        println("掌握UIkit技术")
    }
    fun masteringTechnologyForSwiftUI(){
        println("掌握SwiftUI技术")
    }
    fun masteringTechnologyForComposeUI(){
        println("掌握ComposeUI技术")
    }
}

class TechnologyForLanguage {

    fun masteringTechnologyForCPP(){
        println("掌握C++技术")
    }
    fun masteringTechnologyForSwift(){
        println("掌握Swift技术")
    }
    fun masteringTechnologyForKotlin(){
        println("掌握Kotlin技术")
    }
}

class TechnologyForNet {
    fun masteringTechnologyAlamofire(){
        println("掌握Alamofire技术")
    }
    fun masteringTechnologyAFNetWorking(){
        println("掌握AFNetWorking技术")
    }

    fun masteringTechnologyRetrofit(){
        println("掌握Retrofit技术")
    }
}

// 外观类

class TechnologyOfHong {
    private var uiTechnology:TechnologyForUI? = null
    private var lgTechnology:TechnologyForLanguage? = null
    private var ntTechnology:TechnologyForNet? = null
    init {
        uiTechnology = TechnologyForUI()
        lgTechnology = TechnologyForLanguage()
        ntTechnology = TechnologyForNet()
    }
    //使用技能
    fun useSkills(){
        lgTechnology?.let {
            it.masteringTechnologyForSwift()
            it.masteringTechnologyForKotlin()
        }
        uiTechnology?.let {
            it.masteringTechnologyForSwiftUI()
            it.masteringTechnologyForComposeUI()
        }
        ntTechnology?.let {
            it.masteringTechnologyAlamofire()
            it.masteringTechnologyRetrofit()
        }
    }
}

// 客户端调用
class ClientFetchTechnology {
    val hong = TechnologyOfHong().let {
        it.useSkills()
    }
}
  • 7.享元设计模式

// 享元模式是池技术的重要实现方式,可以减少程序创建的对象,降低程序内存的占用,提高程序性能

// 定义:使用共享对象有效地的支持大量细粒度的对象(相当于现在的女孩子,都有很多老公。。)

要求细粒度对象,那么不可避免地会使得对象数量多且性质相近。这些对象分为两个部分:

  • 内部状态和外部状态。
  • 内部状态:是对象可以共享出来的信息,存储在享元对象的内部并且不会跟随环境的改变而改变。
  • 外部状态:是对象依赖的一个标记,它是随着环境的改变而改变,并且不可以共享的状态。
interface FlyweightRole {
    fun showWhat(what:String)
}

class ConcreteFlyweightRole(name: String = ""):FlyweightRole{
    private var name:String = ""
    private var version:String = ""
    init {
        this.name = name
    }
    
    override fun showWhat(what: String) {
        when(what){
            "32G" -> println("price is 5199")
            "128G" -> println("price is 5999")
        }
    }
}

// 享元工厂
class FlyweightFactory {

    companion object {

        private val pool:MutableMap<String,ConcreteFlyweightRole> = HashMap<String,ConcreteFlyweightRole>()

        fun getConcreteFlyweightRoles(key: String):ConcreteFlyweightRole? {
            if (pool.containsKey(key)) {
                return pool.get(key)
            } else {
                return pool.getOrPut(key){// 添加一个当前key的键值对,并且返回value
                    return null
                }
            }
        }
    }
}

// 客户端调用

class ClientForFlyweight {
    val ff1 = FlyweightFactory.getConcreteFlyweightRoles("iphone 13").let {
        it?.showWhat("32G")
    }

    val ff2 = FlyweightFactory.getConcreteFlyweightRoles("iphone x pro").let {
        it?.showWhat("128G")
    }
}

行为设计模式

    1. 策略设计模式

好处:隐藏具体策略的实现细节,彼此完全独立

坏处:一个策略一个类,复用性小(但其实我们真正要隐藏的细节没那么多,OK)

interface FightingStrategy {
    fun fighting()
}

// 具体策略实现

class WeakRivalStrategy:FightingStrategy {
    override fun fighting() {
        println("遇到了较弱的对手..")
    }
}

class StrongRivalStrategy:FightingStrategy {
    override fun fighting() {
        println("遇到了较强的对手..")
    }
}

// 上下文角色
class ContextStrategy(fs:FightingStrategy) {
    private var fs:FightingStrategy? = null
    init {
        this?.fs = fs
    }
    fun contextFighting(){
        this.fs?.fighting()
    }
}

// 客户端调用

class ClientForStrategy {
    var contextOf = ContextStrategy(WeakRivalStrategy()).let {
        it.contextFighting()
        ContextStrategy(StrongRivalStrategy()).let {
            it.contextFighting()
        }
    }
}
    1. 模版方法设计模式

在程序开发中,有时候会遇到某个方法的实现需要多个步骤,其中有些步骤是固定的(好比:VideoToolBox的编码步骤,
而有些步骤并不固定,存在可变行为,为了提高代码的复用性和系统的灵活性,可以使用模版模式来匹配这种情况。

定义:一个操作中的算法框架,将一些步骤延迟到子类中,使得子类不改变算法的结构,也可重定义算法的某些特定步骤。

abstract class AlgorithmKit {
    protected abstract fun one()
    protected abstract fun two()
    protected abstract fun three()
    protected abstract fun four()
    protected abstract fun five()
    protected abstract fun six()
    protected abstract fun seven()
    protected abstract fun eight()
    protected abstract fun nine()
    protected abstract fun ten()
    protected abstract fun moves()
    protected fun hasWeapons():Boolean {
        return false
    }
    protected abstract var hook:(()->Unit)?
    protected fun meridian(){
        println("子午线")
    }

    fun start(){
        one()
        two()
        three()
        meridian()
        if (hasWeapons()){
            four()
            five()
        }
        six()
        seven()
        moves()
        eight()
        nine()
    }
}

// 具体实现类
class ConcreteAlgorithm01:AlgorithmKit(){
    override fun one() {

    }
    override fun two() {

    }
    override fun three() {

    }
    override fun four() {

    }

    override fun five() {

    }
    override fun six() {

    }
    override fun seven() {

    }

    override fun eight() {

    }

    override fun nine() {

    }
    override fun ten() {

    }
    override fun moves() {

    }

    override var hook: (() -> Unit)? = {
        println("算错了")
    }
    init {
        this.hasWeapons().also {
            if (it == true) !it
        }
        // 这一步放在let中执行,性能更好
        this.hook?.let { it() }
    }
}

class ConcreteAlgorithm02:AlgorithmKit() {
    override fun one() {

    }
    override fun two() {

    }
    override fun three() {

    }
    override fun four() {

    }

    override fun five() {

    }
    override fun six() {

    }
    override fun seven() {

    }

    override fun eight() {

    }

    override fun nine() {

    }
    override fun ten() {

    }
    override fun moves() {

    }

    override var hook: (() -> Unit)? = {
        println("算对了")
    }
    init {
        this.hasWeapons().also {
            if (it == true) !it
        }
        this.hook?.let { it() }
    }
}

// 客户端调用
class ClientForAlgorithm {
    val client01 = ConcreteAlgorithm01().start()
    val client02 = ConcreteAlgorithm02().start()
}
    1. 观察者设计模式

观察者模式又被称为发布--订阅模式,属于行为设计模式的一种,是项目中经常使用的模式。

定义:定义对象间一种一种一对多的依赖关系,每当一个对象的状态改变时,所有依赖于它的对象都会收到通知并自动更新

// 抽象观察者
interface ObserverMode {
    fun update(message:String)
}

// 具体观察者
class GeneralUser(name:String):ObserverMode {
    var name:String? = null

    override fun update(message: String) {
        println(message)
    }

    init {
        this.name = name
    }
}

// 抽象被观察者 提供了attach\detach\notify 三个方法
interface SubjectMode {
    fun attachObserver(er:ObserverMode) // 添加观察者
    fun detachObserver(er:ObserverMode) // 删除观察者
    fun notifySubscribe(message:String) // 通知更新消息
}

// 具体被观察者
class BeingObserverForUser:SubjectMode {

    // 存储订阅的用户
    private val userList:MutableList<ObserverMode> = mutableListOf<ObserverMode>()

    override fun attachObserver(er: ObserverMode) {
        userList.add(er)
    }

    override fun detachObserver(er: ObserverMode) {
        userList.remove(er)
    }

    override fun notifySubscribe(message: String) {
        userList.forEach {
            it.update(message)
        }
    }
}

//客户端使用
class ClientForObserver {
    // 创建用户
    val user01 = GeneralUser(name = "hong")
    val user02 = GeneralUser(name = "yxm")
    val user03 = GeneralUser(name = "lina")
    // 创建被观察者 以及 完成订阅:被观察者去添加观察者
    val what = BeingObserverForUser().let {
        it.attachObserver(user01)
        it.attachObserver(user02)
        it.attachObserver(user03)
        it.notifySubscribe("Hong Lina")
    }
}
thank..
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 导语:设计模式是无数码农前人在实际的生产项目中经过不断的踩坑、爬坑、修坑的经历总结出来的经验教训,经过抽象之后表达...
    程序员技术圈阅读 606评论 1 3
  • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计...
    Jinbeen阅读 1,640评论 0 6
  • 编程是一门技术,更是一门艺术 面向对象:可维护 、可复用、可扩展、灵活性好 [TOC] 设计模式六大原则 单一职责...
    Snail127阅读 229评论 0 0
  • 本文旨在快速梳理常用的设计模式,了解每个模式主要针对的是哪些情况以及其基础特征,每个模式前都有列举出一个或多个可以...
    蛮三刀酱阅读 1,781评论 0 1
  • 《设计模式之禅》笔记 6大设计原则 单一职责原则:应该有且仅有一个原因引起类的变更。简单来说,一个类中应该是一组相...
    xiaogmail阅读 1,408评论 0 1