设计模式:从菜鸟到大鸟,23 种模式的整体视角
一、前排感受
用了三个星期的时间终于拜读完了《大话设计模式》。
其中书读了三遍,第一遍快速阅读,丛中获得了一个整体的大框架;第二遍仔细阅读,讲书中的所有的例子都动手操作了,不但熟悉运用了C#,更深刻的锻炼了面向对象的意识;第三遍整体对比看书,把相似的模式都进行对比学习。
学习《设计模式》有几种境界,第一种是学习了一两个设计模式,就一直想用到自己的代码中去;第二种是学完全部设计模式,觉得很多模式都很相似,分不清楚它们之间有什么区别;第三种是灵活运用设计模式,就算不用具体哪种模式也可以设计也高质量的代码,无剑胜有剑。
我觉得我现在就是第二个境界,觉得她们长得太像了,自已熟练的运用还需要很长时间的锻炼,这一方面,就感觉小菜很厉害啊,大鸟轻轻的点拨一下就可以将代码写出来。我目前可没有这种本事。不过,迟早会有的!
二、如何学习?
是什么?
小时候最喜欢看《射雕英雄传》,里面的郭靖通过学习《九阴真经》、《降龙十八掌掌法精义》、《武穆遗书》等武林秘籍,最终成为了武林盟主。而这基本武林秘籍也是每一个武林中人都梦寐以求的。
《设计模式》就是我们编程的武林秘籍。将这些模式和原则熟练的运用到编程中,可以让我们编写的软件更上一层楼!
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性
怎么学?
整体结构
下面通过对整体的宏观概况,让我们对设计模式更加的熟悉:
这么多的武林招式我们怎么才能记住?怎么才能熟练的运用呢?下表引用自刘伟老师的博客,在这张表中很清晰的展示了所有的设计模式的学习难度和使用频率:
常用设计模式一览表
类型 |
模式名称 |
学习难度 |
使用频率 |
创建型模式 Creational Pattern |
单例模式 Singleton Pattern |
★☆☆☆☆ |
★★★★☆ |
简单工厂模式 Simple Factory Pattern |
★★☆☆☆ |
★★★☆☆ |
|
工厂方法模式 Factory Method Pattern |
★★☆☆☆ |
★★★★★ |
|
抽象工厂模式 Abstract Factory Pattern |
★★★★☆ |
★★★★★ |
|
原型模式 Prototype Pattern |
★★★☆☆ |
★★★☆☆ |
|
建造者模式 Builder Pattern |
★★★★☆ |
★★☆☆☆ |
|
结构型模式 Structural Pattern |
适配器模式 Adapter Pattern |
★★☆☆☆ |
★★★★☆ |
桥接模式 Bridge Pattern |
★★★☆☆ |
★★★☆☆ |
|
组合模式 Composite Pattern |
★★★☆☆ |
★★★★☆ |
|
装饰模式 Decorator Pattern |
★★★☆☆ |
★★★☆☆ |
|
外观模式 Façade Pattern |
★☆☆☆☆ |
★★★★★ |
|
享元模式 Flyweight Pattern |
★★★★☆ |
★☆☆☆☆ |
|
代理模式 Proxy Pattern |
★★★☆☆ |
★★★★☆ |
|
行为型模式 Behavioral Pattern |
职责链模式 Chain of Responsibility Pattern |
★★★☆☆ |
★★☆☆☆ |
命令模式 Command Pattern |
★★★☆☆ |
★★★★☆ |
|
解释器模式 Interpreter Pattern |
★★★★★ |
★☆☆☆☆ |
|
迭代器模式 Iterator Pattern |
★★★☆☆ |
★★★★★ |
|
中介者模式 Mediator Pattern |
★★★☆☆ |
★★☆☆☆ |
|
备忘录模式 Memento Pattern |
★★☆☆☆ |
★★☆☆☆ |
|
观察者模式 Observer Pattern |
★★★☆☆ |
★★★★★ |
|
状态模式 State Pattern |
★★★☆☆ |
★★★☆☆ |
|
策略模式 Strategy Pattern |
★☆☆☆☆ |
★★★★☆ |
|
模板方法模式 Template Method Pattern |
★★☆☆☆ |
★★★☆☆ |
|
访问者模式 Visitor Pattern |
★★★★☆ |
★☆☆☆☆ |
【作者:刘伟 http://blog.****.net/lovelion】
记是记不住
通过这个表,我们就可以很轻松的了解,有哪些模式。但是这么多模式记是记不住的,更重要的是我们要熟练的应用。
编织知识网
把旧知识和《设计模式》对比学习,拉近我们学习过程中的陌生感。
比如,在《设计模式》中,每一个设计模式都会有一张对应的类图,这就可以让我们亲自动手去画一画,然后实现代码。看看用软件生成的代码和书本上的一样吗。
亲自动手
设计模式有很多个,书本里的例子就更多的数不过来。有地时候只有亲自动手实践才能更好的学会如何操作。
利用互联网
我基本是一天一个模式,每天都会在最后自己进行反思。更好的方式是利用互联网:每学完一个模式,自己动手查一查,看看网上有没有大神和我的思想一样。经过碰撞,会让我对设计模式的理解更加深刻。
三、改变思想
面向过程→面向对象
《大话设计模式》中的例子是用C#完成的,而C#是完全面对对象的,这就需要我们能跟在心里添加面向对象的思想,面向对象以可复用、可维护的特点玩败面向过程。遇到简单的问题,我们都要从心里用面向对象的思想去思考一下。
四、小结
《设计模式》真是一个大宝库啊!每一个模式都是精髓!都值得我们品味!
会通过以后的不断实践来熟练技术,提升思想。另外向大家推荐一位大神:刘伟老师。
推荐阅读
-
NeurIPS 2022 | 最强斗地主AI!网易互娱AI Lab提出基于完美信息蒸馏的方法-完美信息蒸馏(PTIE) 在斗地主游戏中,非完美信息的引入主要是由于三位玩家均不能看到别人的手牌,对于任意一位玩家而言,仅可知道其余两位玩家当前手牌的并集,而难于精准判断每位玩家当前手牌。完美信息蒸馏的思路是针对这种非完美问题,构建一个第三方角色,该角色可以看到三位玩家的手牌,该角色在不告知每位玩家完美信息的情况下通过信息蒸馏的方式引导玩家打出当前情况下合理的出牌。 以强化学习常用的 Actor-Critic 算法为例,PTIE 在 Actor-Critic 算法的应用中可以利用 Critic 的 Value 输出作为蒸馏手段来提升 Actor 的表现。具体而言即在训练中 Critic 的输入为完美信息(包含所有玩家的手牌信息),Actor 的输入为非完美信息(仅包含自己手牌信息),此种情况下 Critic 给予的 Value 值包含了完美信息,可以更好地帮助 Actor 学习到更好的策略。 从更新公式上来看,正常的 Actor-Critic 算法 Actor 更新的方式如下: 在 PTIE 模式下,对于每个非完美信息状态 h,我们可以在 Critic 中构建对应的完美信息状态 D(h),并用 Critic 的输出来更新 Actor 的策略梯度,从而达到完美信息蒸馏的效果。 PTIE 框架的整体结构如下图所示: 无论是训练还是执行过程中智能体都不会直接使用完美信息,在训练中通过蒸馏将完美信息用于提升策略,从而帮助智能体达到一个更高的强度。 PTIE 的另一种蒸馏方式是将完美信息奖励引入到奖励值函数的训练中,PerfectDou 提出了基于阵营设计的完美信息奖励 node reward,以引导智能体学习到斗地主游戏中的合作策略,其定义如下: 如上所示,完美信息部分 代表 t 时刻地主手牌最少几步可以出完,在斗地主游戏中可以近似理解为是距游戏获胜的距离, 代表 t 时刻地主阵营和农民阵营距游戏获胜的距离之差, 为调节系数。通过此种奖励设计,在训练时既可以一定程度地引入各玩家的手牌信息(出完的步数需要知道具体手牌才能计算),同时也鼓励农民以阵营的角度做出决策,提升农民的合作性。 特征构建: PerfectDou 针对牌类游戏的特点主要构建了两部分特征:牌局状态特征和动作特征。其中牌局状态特征主要包括当前玩家手牌牌型特征、当前玩家打出的卡牌牌型特征、玩家角色、玩家手牌数目等常用特征,动作特征主要用于刻画当前状态下玩家的所有可能出牌,包括了每种出牌动作的牌型特征、动作的卡牌数目、是否为最大动作等特征。 牌型特征为 12 * 15 的矩阵,如下图所示: 该矩阵前 4 行代表对应每种卡牌的张数,5-12 行代表该种卡牌的种类和对应位置。 网络结构和动作空间设计 针对斗地主游戏出牌组合数较多的问题,PerfectDou 基于 RLCard 的工作上对动作空间进行了简化,对占比最大的两个出牌牌型:飞机带翅膀和四带二进行了动作压缩,将整体动作空间由 27472 种缩减到 621 种。 PerfectDou 策略网络结构如下图所示: 策略网络结构同样分为两部分:状态特征部分和动作特征部分。 在状态特征部分,LSTM 网络用于提取玩家的历史行为特征,当前牌局状态特征和提取后的行为特征会再通过多层的 MLP 网络输出当前的状态信息 embedding。 在动作特征部分,每个可行动作同样会经过多层 MLP 网络进行编码,编码后的动作特征会与其对应的状态信息 embedding 经过一层 MLP 网络计算两者间的相似度,并经由 softmax 函数输出对应的动作概率。 实验结果
-
设计模式]从菜鸟到大鸟的 "设计模式大讲堂 "新手体验
-
设计模式:从菜鸟到大鸟,23 种模式的整体视角
-
对话NGC蔡岩:从机制创新到价值沉淀,解析DeFi产品开发逻辑 |链捕手 - 真正的DeFi产品首先要有足够的安全性和稳定性,如果能在此基础上有一些功能创新,那就非常好了。像 Uniswap 这样逐渐成为 DeFi 基础架构的产品,可遇而不可求。 链式捕手:固定利率协议之前关注度比较高,但观察下来发现,大部分协议还是类似于传统金融CDO(抵押债务凭证)的玩法,风险系数很高,您如何理解这块业务的价值和风险? 蔡岩:确实有些定息协议类似CDO玩法,背后绑定一个债券,但并不是所有的定息协议都是这样的玩法,像这种CDO玩法的主要代表项目是88mph,背后绑定的是Aave、Compoud这样的借贷协议,在此基础上做定息和浮息债券;像APWine,背后同样是Aave,它会发行期货收益代币来锁定你的收益;Notional本身是做借贷市场的,在此基础上做定息协议。 非 CDO 的玩法,比如 Horizon,更像是一个利率撮合器,背后需要用户通过拍卖产生更合适的目标收益率;像 Saffron、BarnBridge 等是通过风险分级来定义不同的收益率。总的来说,创新还是挺多的。 价值层面是创新和想象力,因为在传统金融领域,比如银行做固定收益证券,或者评级机构给风险分级,这些业务都非常大,利润也很丰厚。而 DeFi 的对口业务给了类似业务很大的想象空间。尤其是固定利率协议的成熟产品不多,尝试各种微创新是很有意义的。 风险程度还是要具体到不同的玩法,比如,在 Aave、Compoud 等借贷协议的固定利率协议背后,如果这些借贷协议受到攻击,与之绑定的固定利率协议也会受损。 同样,如果自己做借贷市场,可能更需要更强的开发能力。再有,如果该程序的机制或参数设计不当,同样会导致协议运行不稳定,并可能造成大量用户清盘。 总的来说,风险在于固定利率协议的设计,这是一个非常复杂的过程,需要不断地尝试和出错。 链式捕捉器:刚刚提到背后是Aave/Compound的固定费率协议风险较大,您认为Aave最大的不确定性和创新点分在哪里? 蔡岩:其实爱钱进一直被认为是走在行业前列的项目,他们的迭代速度非常快,比如率先尝试闪贷、推出新的经济激励模式、推出目前业内首个安全模块、尝试L2解决方案等等。 而在主要的借贷业务上,他们又十分谨慎,比如在抵押率、清算系数等风险参数的设计上相对于其他借贷协议较为保守,并不会存在为了吸引更多借贷资金而降低风险的要求。 与许多 DeFi 项目一样,即使 Aave 进行了多次审计,也无法保证不存在漏洞。前段时间,Aave 刚进入 V2 阶段时,白帽黑客就指出了某个漏洞。 之前的创新点可能是闪电借贷,这是当时业内独一无二的新产品功能,也为 Aave 带来了不少收益。当然,也有人批评闪电贷只能方便黑客实现资金效益的最大化,但工具本身并没有错,未来闪电贷肯定会有更多的应用场景。 其次是安全模块的设计,这有点像项目本身的储备金库,保障项目的安全性,这也是爱维开创的先河。说实话,目前大多数项目都没有做到代币模式的良性或正向运营,也做不到像Aave一样的安全模块,这是一个不小的门槛。 Chaincatcher从某种程度上来说,挖矿模式是DeFi财富效应的根本支撑,但Aave的CEO却说挖矿机制带来的动力是不可持续的,您怎么看这个观点? 蔡岩:"挖矿机制 "不可能失效,因为它是一种激励机制,或者说是项目冷启动的一种方式。但流动性开采亚博体育手机客户端不会一直高涨。比如去年11月的流行性挖矿高APY持续了一两个月就崩盘了,导致DeFi市场大幅回调。 Aave、Uniswap、Synthetix等项目真正爆发进入市值前15名也是在今年2月,我更倾向于这是头部DeFi长期价值的体现。虽然大家都喜欢抢高APY的矿机,但我个人很少参与挖矿,所以我并不觉得流动性挖矿是DeFi的基本面支撑。