设计模式浅析

    话说设计模式,一般平民码农,单打独斗的,其实很少能用得到,实现功能就ok了,但往高处走这些东西又少不了,下面解析几个吧!

一、UML

    开局之前说下UML,不会UML,设计模式就废了一般,先讲几个关系的UML例图

    类本身(分为三层,第一层显示类的名称,如果是抽象类,则用斜体表示;第二层是类的成员变量;第三层类成员函数),其中-表示私有,:后面表示函数返回值或者本属性类型


        继承接口(在类上连接线加圈,圈放在类下方,接口本身就是一个只有类函数的类)


继承(连接父子类,父类的连接处加空心三角)


合成关系(整体不存在,个体没有意义,线连接,个体是45度箭头,组合体是实心棱形,具体参照下面的例子,空心变黑色实心就可以,合成貌似在代码里面用的有点少,具体代码就是B的类包含在A类中,并且初始化也在A类中

    聚合关系(部分可以拆开,个体是45度箭头,组合体是实空心棱形,对代码来说就是类中的变量,比如汽车类中声明了引擎类及轮胎类,并可能引用了其函数


     依赖(被虚线相连被依赖方是两边45度的箭头,在一个类中,某个方法的参数为另外一个类(或几个类)的类型)和关联(实线箭头,一个类中引用了另外一个类,箭头那端表示被引用的对象)不太重要就不举例子了

参考网页:UML类图简单学习

二、具体的设计模式(按照《大话设计模式》,23种)

     1、工厂模式(各种情况对应各种类,箭头另外一端是引用者,其他是被引用者)、策略模式(switch case结构)


     2、装饰模式(由传入类本身指针来决定结果采用何类函数,上层设计完成以后,工厂模式就不能改了,由于switch那里决定了能有几个子类,但是装饰还可以通过传参数进Createfactory的方式增加同级子类,扩展增加函数等等,装饰模式的扩展性更大,但是工厂模式的结构更直接,并且对客户端来说代码更少),参见工厂和装饰模式的区别


               3、代理模式(利用类继承接口来实现,中间过渡一个代理者,来执行追求者的函数代理人知道Request接口,因为继承于同一个类,另外客户也知道该函数,因为申明依赖的关系;应用:通过代理实现规定的功能,防止其他改变)


     4、工厂方法模式(判断逻辑放在了客户端(原来在switch位置),这样用不开放switch分支,实现增加另外的功能,并且这里用了一个延迟的手段:子类继承没有任何实际意义的接口父类,并且重载父类函数,在父类函数中实例化自己,最后在客户端进行调用父类的Create函数来生成具体子类),参见网页:从简单工厂到工厂方法


               5、原型模式(继承了一个可以复制(浅复制或者深复制都可以,浅复制重新实例化,深复制是重复使用一个)并且的接口)


     6、模板方法模式(父类全是抽象的函数和共同的部分,实现在各个子类,相同步骤,不同小部分,主要在到代码复用,相同部分在vaLIDATE及display及Handle里面,不同在各自子类的函数,如果子类函数有几个的话,就是同名不同意,也就是相同步骤,不同的小部分的具体体现


     7、外观模式(将所有动作包装成一个类的几个方法,这样直接调用构造的类即可),所有的软件都可以分为三层:数据访问层、业务逻辑层、表示层(增加外观模式能够减少层之间的耦合),其实这个很像上下层接口,client使用外观类,外类在具体的函数中灵活使用具体类1类2类3


     8、建造者模式(分步骤,不同的各个写类):个人认为建造者模式=指挥者外观模式(具体买基金的人)+模板方法模式(个人非常赞赏我之前写的话)。建造者模式和模板模式的区别参见网页模板方法模式vs建造者模式


     9、观察者模式(用来解耦,不要类与类之间相互定义对象(一个对象的改变需要同时改变其他对象)),列表管总所有的情况(管总类+列表类,列表类子类,其实技巧就是老板类通过函数调用关系(也可以用事件委托,这样就可以动态添加,不用改动原来代码,只在客户端动态添加就好)知道观察抽象类的接口,而股票和篮球继承了观察类,所以老板类列表就可以通知到其他),应用于通知更新,


     10、抽象工厂模式(一个类,不同的数据库通过改动一小段代码就可以解决,将new藏在具体的类中(这样就存在依赖),就是把不同的操作用创建不同类来解决问题,当不同的种类变多的时候可用简单工厂来解决


     11、状态模式(将选择支变成各种状态,让其在内部转换,每个状态内部调用选择是否建立下个类或者直接输出(外部context必须要有),增加状态只需要增加类就好,最小改动,单一化了工作职责,记住有个类定义初始状态,当前状态


     12、适配器模式(数据行为和操作都对,但是接口不对,就是需要考虑适配器模式,在适配的类声明内部重新声明一个私有的新类,重新包装。


     13、备忘录模式(在不破换封装的情况下,捕获对象内部状态,下图右面这个是角色管理者,能够得到GameRole备忘录,然后给GameRole去恢复,但其消耗内存,其实也是一种封装)


     14、组合模式(将对象的组合成树形结构表示部分和整体的层次结构)


     15、迭代器模式(提供一种顺序访问聚合对象的各个元素,而又不暴露该对象内部的方法,和list、vector实现的是同等功能,两个抽象类提供接口,具体有聚集类去实现加入各个元素,迭代器类去访问,而客户只需要知道两个抽象类就可以了)


     16、单例模式(私有构造方法,并用静态函数new构造函数,并且将返回的指针指向静态私有指针)


     17、桥接模式(将抽象部分与它实现部分分离,使它们都可以独立变化,品牌和软件分类都可以独立出来,让他们各自变化,桥接模式可实现两层,用初始化类的方式可以实现品牌,用指针导入的方式可以实现第二层


     18、命令模式(将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化):执行类、waiter类(list,增加,删除,通知)、客户(下几个命令,都和执行类依赖


     19、职责链模式(这个和状态模式有点像,实际是状态模式=职责链模式+指挥者HANDLER类,可以定义链接怎么流动,通过指针方式把权限落到客户手中)


     20、中介者模式(用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示的就可以相互引用,具体完成是通过声明具体多个类,通过中介类就可以调用另外类的函数,中介者的工作就是这个发送函数里面那个接受。多对多的时候不一定合理)


     21、享元模式(用一个工厂来管理已有和没有的对象,先初始化一批,客户端调用,如果已有返回一个已有对象,如果没有就新建一个再返回,已达到节省内存的目的)


     22、解释器模式(解释语句,客户需要知道解释器的接口及背景,然后解释器就通过类似工厂模式开始工作了


     23、访问者模式(作用于某个对象结构中的各元素的操作。指针加入了新的算法类,然后形成新的结果,objectstructure是关键,,有一个循环结构,在加入后会,调用接口里面的所有函数


     具体每个类的的UML图及代码见23种设计模式UML及其代码wallwind的设计模式专栏

三、总结和辨析

     可以分为几类:中介(中介者、命令、解释器)+单例+隐藏共同+状态转移+复制+list

总结,其实延迟到客户端(通过IF或者指针的方式都可以),提取共同的问题(建造者+模板方法+原型),然后就是分类分层次(初始化一次,指针第二次),然后就是包装(代理+中介者+外观模式),访问者+观察者比较特别,都用了一点事件委托的意思

      多读一遍书,会有不同的感悟,下次再读,会多些什么呢,加油!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值