![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 62
ZengXincs
Gonna Be a Better Man
展开
-
设计模式之:与设计模式相处
如果你发现自己处于某个情境下,面对着愈达到的目标被一群约束影响着的问题,然而,你能够应用某个设计,克服这些约束并达到该目标,将你凌想某个解决方案。(设计模式是解决一个经常重复发生的设计问题):是在某情境下,针对某问题的某种解决方案。原创 2023-12-09 17:00:20 · 181 阅读 · 0 评论 -
设计模式之十二:复合模式
现在需要保证Quackable的具体类都能扮演QuackObservable角色(在具体类中添加一个arraylist变量,然后实现接口方法)。但这里用的不同的做法(不知道为什么),在Observable类中封装注册和通知的代码,然后将其和具体类组合在一起。需求3,有时候我们在代码中可能搞忘装饰对象,所以我们希望在最开始创建的时候就确保鸭子是被装饰过的:工厂模式。需求1,有鸭子的地方大概率就会有鹅,怎样在模拟器使用鹅呢?需求2,如果在不变化鸭子类的情况下,计算呱呱叫的次数呢?原创 2023-11-26 15:29:08 · 527 阅读 · 0 评论 -
设计模式之十一:代理模式
RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。RMI的好处在于你不必亲自写任何网络或I/O代码。客户程序调用远程方法就和运行在客户自己本地JVM对对象进行正常方法调用一样。代理可以控制和管理访问。步骤一:制作远程接口。步骤一:制作远程实现。原创 2023-11-12 23:07:00 · 1148 阅读 · 0 评论 -
设计模式之十:状态模式
以上的代码最大的问题就是没有遵守开发-关闭原则,一遇到新的需求(投币后有10%的概率出现“赢家”状态,给出2颗糖果)就需要修改源代码,重新整理所有代码的逻辑。通过将行为包装进状态对象中,可以通过在context内简单改变状态对象来改变context的行为。:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。策略模式和状态模式的类图是一样的(回去翻了下书,好像没瞅到),但。在新的糖果机中,我们不使用静态整数,而使用state对象。状态模式通过改变对象内部的状态来帮助对象控制自己的行为。原创 2023-09-17 22:20:22 · 713 阅读 · 0 评论 -
设计模式之六:命令模式(封装调用)
假如需要一个遥控器,遥控器有一个插口可以插上任意的命令接口(比如控制空调开关,洗衣机开关,客厅灯开关)。Receiver就是灯这个对象,把灯这个对象封装到command对象中,再使用组合,把command放在invoker(遥控器)里面。这样子invoker就不知道具体的操作细节,并可以与具体操作解耦。命令模式:将请求封装成对象,这可以让你使用不同的请求、队列或者日志请求来参数化其它对象。命令模式可以将请求的对象和执行请求的对象解耦(实际上是通过命令对象进行沟通,即解耦)。(个人感觉,这章讲的很一般)原创 2023-08-06 17:33:14 · 1036 阅读 · 0 评论 -
设计模式之五:单例模式
这种方法又叫做 Meyers' SingletonMeyer's的单例, 是著名的写出《Effective C++》系列书籍的作者 Meyers 提出的。对比全局变量,其需要在程序开始就创建好对象,如果这个对象比较耗资源,而在后面的执行过程中又一直没有用到,就造成了浪费。具体的可以看下最后贴的参考文献。如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。这样保证了并发线程在获取静态局部变量的时候一定是初始化过的,所以具有线程安全性。原创 2023-08-06 16:30:56 · 1240 阅读 · 0 评论 -
设计模式之七:适配器模式与外观模式
当你想要观影的时候,必须先执行一些任务,如打开DVA、投影机、屏幕、音响、爆米花机,然后调整好声音,屏幕大小等。这十分的麻烦,因此,我们可以使用外观模式,提供一个方法,把以上内容都搞定。提供了一个统一的接口,用来访问子系统中的一群接口。接下来会马上介绍外观模式,我们在这里可以通过模式的设计意图区分装饰者、适配器和外观模式。将一个类的接口,转换成客户期望的另一个接口。实际上,适配器有两种,前面介绍的是“对象” 适配器。下面则是“类”适配器。面向对象适配器将一个接口转换成另一个接口,以符合客户的期望。原创 2023-08-13 17:13:20 · 808 阅读 · 0 评论 -
设计模式之八:模板方法模式
别调用我们,我们回调用你。此原则可以防止“依赖腐败”,高层组件依赖低层组件,低层又依赖高层组件,...。在一个方法中定义了一个算法的骨架,而且将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现(依赖子类提供某些或所有步骤的实现,父类拥有并保护这个算法)。Hook(钩子)这个方法可以什么都不做,子类视情况决定是否覆盖它们,也可以做一些默认的事情。钩子的存在可以让子类有能力对算法的不同点进行挂钩。原创 2023-08-26 18:55:52 · 713 阅读 · 0 评论 -
设计模式之九:迭代器与组合模式
若用户直接从这些数据结构中取出对象,则需要知道具体是存在什么数据结构中(如栈就用peek,数组[])。迭代器能够让客户遍历你的对象而又无法窥视你存储对象的方式。这两种不同的菜单表现方式,会使得女招待需要知道菜单的实现细节,才能对菜单进行遍历。对象村餐厅和煎饼屋合并了,它们有着不同的菜单列表,但菜单项基础都是一样的。因此,我们需要创建一个对象(迭代器),封装“遍历集合内的每个对象的过程”。当我们拥有迭代器接口后,我们就可以为各种对象集合实现迭代器。如果还有第三家餐厅以不同的实现出现,我们就需要有三个循环。原创 2023-08-27 18:02:03 · 781 阅读 · 0 评论 -
设计模式:生成器模式
这个模式书上讲的比较简单,但是感觉精华应该是讲到了。引用下其它博客的总结:生成器模式的核心。原创 2023-07-30 21:08:37 · 516 阅读 · 1 评论 -
设计模式之四:工厂模式
我们知道其中的if..elseif..elseif代码部分会改变,因此,我们阔以将创建pizza的代码移到一个专职创建pizza的对象中去。这个新对象就叫做“工厂”,一旦有了SimplePizzaFactory,orderPizza就变成了此对象的客户。这里有一些相关的具体类,要在运行时有一些具体条件来决定究竟实例化哪个类。这样的代码(if..elseif..elseif),一旦有变化或扩展,就必须重新打开进行检查和修改。(利用静态方法定义一个简单的工厂,被称为静态工厂。原创 2023-07-29 16:52:23 · 564 阅读 · 0 评论 -
设计模式之三:装饰者模式
如果要改变一种调味的价格,也需要修改许多的类)(利用继承设计子类的行为,是在编译时静态决定的,而且所有子类都会继承到相同行为。然而,如果利用组合的做法扩展对象行为,就可以在运行时动态进行扩展)可以通过set方法来设置添加调料的种类,然后在基类的cost计算调料的价格。子类中的cost再调用父类的cost并加上自己的价格。装饰者模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(使用对象组合的方式,在运行时装饰类)。对修改关闭是因为,现有代码是正确的,如果允许修改,则容易引入bug。原创 2023-07-09 17:09:58 · 539 阅读 · 0 评论 -
设计模式之二:观察者模式
假定我们需要为Weather-O-Rama公司建立一个气象站系统,除已有的WeatherData有数据源类,还需要更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。除使用上面的“推”方式主动将数据传送给观察者,还可以通过“拉”方式主动拉取数据(可以传递一个主题对象,或者数据对象给update方法,或者从私有变量中提取)。观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。另一方面,观察者使用这些状态,虽然这些状态不属于他们。原创 2023-07-08 23:20:45 · 749 阅读 · 0 评论 -
设计模式入门:策略模式
但如果出现一个橡皮鸭,我们只能在子类中覆盖fly方法,FlyNoWay,同时,也需要覆盖quack方法,吱吱叫。如果还有其它的鸭子子类,如诱饵鸭等等,那么就需要在各自的子类中进行修改,检查是否需要修改quack和fly方法。这本书是用的Java,如果这里是C++,是不是会想到flyable和quackable是接口,然后再有类继承接口,最后Duck子类实现多类继承?(会变化的部分封装起来,以后就可以轻易改动或扩充此部分,而不影响其它不需要变化的部分)或者直接是继承多个超类,需要覆盖的在子类中覆盖?原创 2023-06-04 15:54:14 · 523 阅读 · 0 评论