设计模式
文章平均质量分 62
有关设计模式的一些理解,希望大佬们多多指点
KvNie
这个作者很懒,什么都没留下…
展开
-
构建器模式(builder)——对象创建类、创建型模式
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。其实没啥好讲的,就是一样的思想,不过构建器模式就是专门用来创建对象的,而且是复杂对象。就是把构建过程放在一个Builder对象里边,解耦性更好,优点也和模板模式差不多。如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?看到上边这段话我的第一反应就是?原创 2023-09-27 14:57:43 · 128 阅读 · 0 评论 -
单例模式(singleton)——对象性能类、创建型模式
单例模式有几个特点,你所知道的构造函数和析构函数都得private,然后要public出一个Get和一个Delete函数用于获得对象和删除对象。注意,这俩得静态函数,不然在没构建出对象之前没办法调用。在软件系统中,存在一种特殊的类,必须保证他们在系统中只存在一个实例,才能保证逻辑正确性以及良好的效率。且这是设计者的责任,而不是使用者的责任。如何绕开常规的构造函数,提供一种机制保证一个类只有一个实例?直接上代码吧,这个代码转载自。懒汉模式(局部静态变量)饿汉模式(线程安全)原创 2023-09-27 15:51:18 · 97 阅读 · 0 评论 -
原型模式(Prototype)——对象创建类、创建型模式
在调用clone函数的时候,传一些不同车型的一些小特质,比如发动机啥的,达到一个原型能创建多种对象的效果。MainForm中的原型对象不是给你用的,当你要用的时候把它当一个工厂,拷贝他就行了,注意得是深拷贝,自己重写一下拷贝构造函数,默认拷贝用的是浅拷贝。当然,这个分场景的哈,如果你需要通过原型对象控制所有克隆对象,即通过对原型对象的修改扩散至其他对象,就用浅拷贝。在软件系统种,经常面临着“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。原创 2023-09-27 11:46:02 · 46 阅读 · 1 评论 -
抽象工厂模式(Abstract Factory)——对象创建类、创建型模式
抽象工厂和工厂模式其实挺类似,都是把new给封装起来,但是使用场景略微不同,抽象工厂模式针对的是“一系列”相互依赖的对象。首先基类有connection、command、read三个,这三个还对应自己的工厂(抽象),对sql这一业务来说,派生了三个业务,还有三个工厂。如果再加个Oracle,直接原地爆炸!所以这就是抽象工厂要解决的一系列对象的创建问题,我们来看看是怎么做的。其实抽象工厂就是工厂模式的一点小延申,至于为什么用抽象工厂模式,理由也基本和工厂模式一样,大家可以去看看笔者之前分享的博客。原创 2023-09-27 11:14:07 · 64 阅读 · 1 评论 -
桥模式(Bridge)——单一职责类,结构型模型
也就是后四个,这是基本功能,你要适配相应的平台,例如PC端,移动端等,那派生两个类咯。后来我才知道,李建忠老师的意思跟我想的不一样,桥模式他解决的是类太冗余了的问题。装饰器那个例子大家可能还记得,不管是Buffer和Crypto还是Network、File的,他们重写的都是read、write和seek函数。MessagerImp是用来做平台层面的适配的,Messager是用来做业务的,这就是两个方向了。由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。这跟装饰器有啥区别?原创 2023-09-26 21:51:30 · 102 阅读 · 0 评论 -
工厂模式(Factory)——对象创建类、创建型模式
直接传splitter解决了其中一个问题,防止代码冗余,有些对象创建起来是麻烦,要好多步骤。你只传一个进来的话(当然这个场景下是够用的),当你后边执行执行着发现,不行,我可能还得创建一个,要怎么办,再new?所以工厂模式,真的优雅!出现的问题是:第一,因为new这个代码比较简单,如果是创建比较复杂的对象,且要多次创建,在每个创建的时候是不是都要写一遍?第一个问题,这不是多此一举,代码中的变化点根本不可能完全消除,工厂模式,乃至全部的设计模式都是为了把变化的点赶在一起,当要修改的时候只需要改很少的地方就行。原创 2023-09-27 10:42:12 · 73 阅读 · 1 评论 -
策略模式(strategy)——组件协作类,行为型模式
由于采用的是完成端口模型,这里得先在主对话框中的函数走一趟,然后去相应的子对话框。目前的实现方法呢,是Completion Key中有一个字段叫DlgID,也就是在主对话框中设计了一个函数,里边有一个switch结构,用于判断Completion Key中的DlgID到底是什么,然后再去相应的对话框下处理数据。在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持不使用的算法也是一个性能负担。第二,在该函数中支持了不必要的算法代码。原创 2023-09-26 10:42:30 · 68 阅读 · 0 评论 -
观察者模式(observer/Event)——组件协作类、行为型模式
第一,拓展问题,我不想用ProgressBar了,想用黑窗口打点形式来显示进度,这里只能再定义一个WindowBar,然后再传进FileSplitter中,然后再设置值进去,繁琐。第二,如果有大量的进度条都要通知呢,这样设计满足不了,因为都是不同类型的,要一个一个去设置值。模板模式是提供一种通用的解决流程,说白了就是框架给你定好了,给你接口,步骤上的小区别你可以自己设计,对程序员更加友好。策略模式想解决的是代码的冗余问题,不需要的代码就不用写,避免if else或者switch这种语句的存在。原创 2023-09-26 17:50:52 · 58 阅读 · 0 评论 -
装饰模式(Democrator)——单一职责类,结构型模式
然后利用构造函数给stm赋值,这样我就不用操心stm具体是文件流啊还是什么流,Crypto类我要负责的就是加密,其他的怂管。并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。通过采用组合而非继承的手法, Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。Decorator模式的目的并非解决“多子类衍生的多继承”问题, Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。原创 2023-09-26 20:44:37 · 43 阅读 · 0 评论 -
模板模式(Template Method)—— 组件协作类、行为类模式
主连接专门用来创建子连接,这里的子连接指不同子功能(文件管理,CMD管理、窗口管理等)所需的连接。step8,肉鸡创建一个Manager对象,处理服务端到来的数据,因为功能很多(删除文件,新建文件,传输文件)要针对不同功能进行处理,服务端创建的新对话框也有这个功能。step9,两者之间传输数据(construct构建数据包,send发送数据包,destruct拆解数据包,recv接收数据包)。step2,服务端那边点击了某一功能(以文件管理为例),向肉鸡发送消息,说要构建子连接。step1,构建主连接。原创 2023-09-26 09:56:13 · 38 阅读 · 0 评论 -
聊一聊设计模式的分类
从目的来看。原创 2023-09-25 22:01:30 · 37 阅读 · 1 评论 -
设计模式原则
从语言层面上看,对象封装了代码和数据从规格层面上看,对象是一系列可被使用的公共接口从概念层面上看,对象是拥有某些责任的抽象。原创 2023-09-25 21:25:59 · 34 阅读 · 1 评论