设计模式
文章平均质量分 64
金色暖阳
总结一下工作中遇到的各种问题,以及解决方法,权当纪念
展开
-
设计模式——(十七)单例模式
背景:MDI程序,点一个工具箱启动一个窗口,点几次,启动几个。经典修改:判断是否为NULL,若为空则new。若在菜单栏也有工具箱,则重复点工具箱的代码。若启动工具箱,把工具箱关闭,在点启动按钮,则工具箱窗口不见了。原因:关闭工具箱,实例没有NULL,而是disposed。可以在在判断条件加isdisposed的判断。若有五处修改的地方,则都要修改。1.正确的做法;实例与否应该由工具箱自己判断。所有类的构造方法,你不提供,系统提供默认的,你提供了,默认无效。将工具箱类的构造方法写为Private,外原创 2021-05-21 17:23:22 · 79 阅读 · 0 评论 -
设计模式——(十六)迭代器模式
迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而又不暴漏该对象的内部表示1.何时使用:当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。可以从车尾遍历,也可以从车头遍历。需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。并为遍历不同的聚集结构提供如开始,下一个,是否结束,当前哪一项等统一的接口。UML结构图总的来说迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构原创 2021-05-21 17:23:04 · 65 阅读 · 0 评论 -
设计模式——(十五)组合模式
背景:类似:办公oa系统,卖电脑的商家,可以单独卖配件,也可以整机卖。复制文件:一个一个复制,或是复制整个文件夹。文本编辑:单独的改变字体色号,或是整段文字。即整体与部分可以被一致对待的问题。总部的财务也可以使用分部的财务。组合模式(Composite)将对象组合成树形结构以表示“部分——整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。UML结构图1.透明方式与安全方式树可能有无数分支,但只需要反复用Composite就可以实现树状结构了。Leaf类中原创 2021-05-20 14:58:35 · 117 阅读 · 0 评论 -
设计模式——(十四)备忘录模式
背景:游戏打boss前存档。一种保存在磁盘,一种保存在内存如网页等。1.游戏角色类有生命力,攻击力,防御值,以及显示,初始状态,战斗函数(参数均设为0)。(set get)客户端(main函数)保存进度,重新定义一个对象将改对象一一赋值过去。恢复即将备份的对象赋值过去。但暴漏了接口和细节。若新增魔法力也不容易修改备忘录模式(memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象状态恢复到原先保存的状态。UML结构图将保存的细节原创 2021-05-20 14:53:01 · 97 阅读 · 0 评论 -
设计模式——(十三)适配器模式
背景:姚明刚开始在NBA需要翻译,将英语翻译为汉语适配器模式(Adapter)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能工作的那些类可以一起工作。适配器模式解决的主要问题:需要的东西就在眼前,但不能马上使用它,短时间也没法改造它,想办法适配它。(笔记本电脑电源适配器)刚开始让姚明学英语,或者教练,球员学习汉语都不现实。翻译工作。(翻译即相当于适配器)1.在软件开发中,系统的数据和行为都正确,但接口不符和时,我们应该考虑使用适配器,目的是使控制范围之原创 2021-05-20 14:33:57 · 105 阅读 · 0 评论 -
设计模式——(十二)状态模式
背景:上午12点之前,写代码。中午13.吃饭,睡觉。15.困,18.加班。20.下班回家。复杂的if else 判断,难以修改和维护,方法过长有坏的味道。面向对象设计其实就是希望做到代码责任的分解。状态模式(state)当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转化的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。(若逻辑判断简单就不用状态模式)UML结构图状态模式的好原创 2021-05-20 14:28:46 · 309 阅读 · 0 评论 -
设计模式——(十一)观察者模式
观察者模式(Publish/Subscribe)背景:老板回来,前台通知大家,但老板和前台一起,就没法通知了1.经典做法。前台类:里面有在她这里注册的观察者。老板回来了,发送消息给注册过的人。看股票者,需要知道前台类,前台类通知了,采取的方法。两个类耦合太强。都需要彼此知道,若增加一个看NBA者,则需要修改三个类。2.好点的做法,看股票者,看NBA者抽象一个类,前台只要知道抽象的类就可以了。但观察者类中还有前台,若前台换人了,老板来了没人通知。老板前台都是通知者,也可以抽象一个类。观察者模式又叫发原创 2021-05-20 11:45:29 · 155 阅读 · 1 评论 -
设计模式——(十)建造者模式
建造者模式(builder)背景:kfc全国各地味道都一样。工作流程都是严格按照规定来的。新研发汉堡,做法相同,配料不同,只是加了一种具体的产品而已。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。又叫生成器模式。该模式将产品的内部表现与产品的生产过程分隔开,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果使用了建造者模式,用户只需要指定需要建造的类型就可以得到它们,具体的建造过程和细节就不用知道。(画人,基类头脚手,设为虚基类,子类继承胖人,瘦人)Perso原创 2021-05-20 11:23:53 · 95 阅读 · 0 评论 -
设计模式——(九)外观模式
外观模式(Facade)为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。背景:大家都不懂股票,去买造成了亏损。但基金可以把钱交给基金经理,由他打理,个人无需知道股票是如何运行的。即加个中间人。专业人做专业事。降低了耦合性。如下:耦合性太高UML结构图C++代码class SystemA {public: void fun1() { cout << "系统A的方法1" << en原创 2021-05-20 11:10:22 · 71 阅读 · 0 评论 -
设计模式——(八)模板方法
模板方法(TemolateMethod)1.重复=易错+难改。试卷类一个 ,学生的抄的考卷继承试卷类,唯一不同的是答案。2.用了继承要让继承有意义,让所有重复的代码都上升到父类去,而不是让每个子类都重复。3.何时使用:当我们要完成在某一细节层次一致的一个过程或者一系列步骤,但个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板模式来处理。模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类之中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。UML结构原创 2021-05-20 11:03:35 · 76 阅读 · 0 评论 -
设计模式——(七)原型模式
原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建指定的细节。等于不用重新初始化对象,而是克隆一份,动态的获得对象运行时的状态。即深拷贝浅拷贝之分。(C++中的复制构造函数)UML结构图...原创 2021-05-20 10:55:18 · 60 阅读 · 0 评论 -
设计模式——(六)代理模式
代理模式(Proxy)为其它对象提供一种代理以控制对这个对象的访问。UML结构图Subject(送礼物基类)类,定义了RealSubject(送礼物方)和Proxy(待送礼物的人)的公用接口,这样就在任何使用RealSubject的地方使用Proxy。C++实现代码class Subject { virtual void sendGif() { cout << "Subject::sendGif()" << endl; }};原创 2021-05-20 10:52:33 · 57 阅读 · 0 评论 -
设计模式——(五)装饰模式
装饰模式(Decorator)动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。(将所需功能安照正确的顺序串联起来进行控制。衣服在内部穿好在show)经典的错误代码:Person类 里面不同的方法,穿不同的衣服。新增种类,则新增函数,客户端代码都需要重新改,违背了开放封闭原则。UML类图Component(组件)是定义一个对象接口,可以给这些对象动态的添加职责。ConcreteComponent(具体组件)是定义一个具体的对象,也可以给这个对象添加一些职责。Deco原创 2021-05-19 17:27:57 · 111 阅读 · 0 评论 -
设计模式——(四)策略模式
策略模式(strategy)策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。1.商场促销 打折八折,九折,满多少减多少,过期不候等等。常用的太麻烦还得时常改动代码。发现相同和不同的2.面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的类抽象集合才是类。打一折和九折只是形式不同而已。3.工厂模式也适用:根据不同的收费模式,创建不同的类,但收费方式新增改变,需要增加类就可以。但每次维护或是扩展都原创 2021-05-19 17:00:07 · 75 阅读 · 0 评论 -
设计模式——设计原则
单一职责原则(SRP)就一个类而言,应该仅有一个引起它变化的原因。手机功能众多但专一性并不很强。(拍摄,游戏,邮件)俄罗斯方块:下落,旋转,碰撞判断,移动,堆积,这些逻辑始终没变。可以移植pc,手机不同的平台。业务,界面,数据分离。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其它职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。俄罗斯方块可移动的区域二维数组a[10][20], 若一个方块原来在【3】【5】下移就是【3】原创 2021-05-19 16:39:56 · 60 阅读 · 0 评论 -
设计模式——(三)抽象工厂模式
实际应用中,若更换数据库,维护两份代码,甚至更多。不方便经典错误做法class User{private: int id; string name;public: void setId(); void getId(); void setName(); void getName();}class SqlServerUser{public: void insertUser(User user); void getUser(int id);}int main(){ SqlSe原创 2021-05-19 16:11:09 · 110 阅读 · 0 评论 -
设计模式——(二)工厂方法模式
1.简单工厂模式。±*/继承基类的方法。在工厂类中有个基类的对象根据传入的在switch创建对象。客户端 Operator *op = OperatorFactory::creatOperator(1); op->setA(5); op->setB(4);double a = op->getResult()工厂方法模式±*/继承基类的方法。客户端Base *b = new BaseAdd(); b.getResult();若增加一个新的开方类,简单工厂模式原创 2021-05-19 11:08:11 · 100 阅读 · 0 评论 -
设计模式——UML类图
UML类图① 矩形框 代表一个类。分三层。第一层类名,若是抽象类,则用斜体。第二层类的特性,字段和属性。第三层类的操作,通常是方法或者行为。+ public -private #protected② 注意飞翔 ,表示一个接口图,与类图的区别在于顶端有《interface》,第一行接口名称,第二行接口方法。接口另一种表示方法:棒棒糖表示法,就是唐老鸭类实现讲人话的接口。④ 实现接口用空心三角形+虚线⑤ 关联关系用实线表示,企鹅是特别的鸟,会游不会飞。一个类知道另一个类时⑥ 聚合关系(聚原创 2021-05-19 10:19:24 · 199 阅读 · 0 评论 -
设计模式——(一)简单工厂模式
简单工厂模式1.多条if会执行多次无用的判断,改为switch2.面向对象编程,写出易于维护,容易扩展,容易复用的代码。3.活字印刷。易维护:只用改动需要改动的地方。(只替换部分字,而不是所有);可复用:用的字的模板,还可以再用;可扩展:要加字,直接加即可;灵活性好:横排,竖排 移动字体即可。4.通过封装,继承,多态,将程序的耦合性降至最低。用设计模式使得程序更加的灵活,容易修改,易于复用。5.将业务逻辑与界面逻辑分开降低耦合。才能易于维护和扩展。Eg:计算器运算类: Opreator ge原创 2021-05-19 10:15:02 · 114 阅读 · 0 评论