目录:

返回顶部

前言:

  因为在学习过程中总是不断忘记,很多东西也是一知半解,所以学一点就又倒回来再复习一次,第一次学习的时候我主要以实现书中的代码为主,而现在复习的时候我就以弄清楚逻辑为主了,毕竟第一次基本都是只要能实现功能就大吉大利了。所以这次小阶段的复习,我就没有再在文章中写代码了,以画UML图为主,边弄清楚逻辑,边搞懂那些知识点。

  复习果然是温故而知新,确实了解到了之前比较迷茫的点,但是还是有很多不明确之处,我觉得应该还需要等把设计模式全部学完一次后再重新倒过来再看一次,可能会有其他收获吧。虽然文中全是UML图,但是所有的例子,在最后我的github中都已经上传了源代码,欢迎指教(#^.^#)。

  ppps:在复习的过程我记录下来整理成博客来分享,但是我觉得我还是说的不是很清楚,只是自己能靠着UML图和实例能大概了解到自己需要了解的知识点,但是介绍出来老是感觉哪里欠缺,我确实需要好好学习一下,怎么正确表述我的观点了。当然,这也是需要坚持写博客的原因了ヾ(◍°∇°◍)ノ゙,要是我的表述让您无法理解,请不吝赐教,让我慢慢了解到应该怎么和别人交谈。

返回顶部

1. Stratrgy Pattern 策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

解析:

  策略模式的主要组成部分主要包括Context/Strategy这两个部分。

  策略类定义了所有支持的算法的公共接口。

  其实StrategyPattern就是将代码尽量的变小,各部分功能尽量单一化,将相似的功能放进同一个函数或者接口里,这个函数或者接口也就是ConcreteStrategyABC了。

实例解析1:

  详细解释:C#学习笔记-策略模式

  这里将优惠的方式分为三种,1:正常收费;2:折扣;3.满减活动;题目中所提到的优惠方式不外乎这三种,所以将优惠方式做成一个接口CashSuper,然后往下再分支成三种具体的优惠方式,这样我们要是某一种优惠方式有变动,直接去具体的那种优惠方式中修改即可,同时,要是添加了新的优惠方式,直接继承CashSuper这个接口,然后添加新的实现方式就好了,这样保证了原来代码的安全,也添加了新的功能。这也是我们的设计原则:封装变化

实例解析2:

  我们设计一些鸭子,这些鸭子有:绿头鸭、红头鸭、橡皮鸭、诱饵鸭等,他们有各自的外貌特征,同时有各自不同的叫声,有的鸭子例如绿头鸭可以飞行,但是橡皮鸭这些却不能飞行。请设计出这些鸭子。

解析:

  鸭子的外貌可以设定为属性,但是叫声和飞行就是两种动作,且有不同种情况:飞行FlyBehavior有两种(FlyWithWings/FlyNoWay两种具体的不同的实现行为),叫声QuackBehavior有很多种情况(例如:Quack/Squeak/MuteQuack),所以我们将飞行行为和叫声这两种行为封装起来,这样保证了不同的鸭子调用自己不同的行为即可,同时保证了如果添加了新的鸭子又有新的行为时,方便添加新的具体的行为进来。

具体实现:

小结:

  好的代码就是让代码变得易维护,而这就是策略模式最大的优点。

返回顶部

2. Observer Pattern 观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己。

解析:

  观察者模式重要的是Subject/Observer这两个接口。

  Subject:他把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供了一个接口,可以删除和增加观察者对象。

  Observer:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。

  抽象模式有两个方面,其中一个人方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立的改变和复用。

实例解析1:

  详细解释:C#学习笔记-观察者模式

  对于具体的Observer而言(也就是MemberOne和MemberTwo),具体的Subject是谁,他们并不需要知道,只要作为Subject的那个人将有用的信息传递给他们就好了。同理,作为具体的Subject而言,不需要知道每一个Observer是谁,只需要在信息更新的时候,将有用的信息传递给在他那注册了的成员就好了。这就实现了软件设计的一个重要原则:为交互对象之间的松耦合设计而努力。

实例解析2:

  现在需要建立气象观测站的一个应用:目前有三种布告板,分别显示目前的状况、气象统计即简单的预报。当WeatherObject对象获得最新的测量数据时,三种布告板必须实时更新。

解析:

  这个题目很明显符合了OberverPattern要求,三个布告板理所当然地就是具体的Observer了,获取各种信息的WeatherData就是具体的Subject了。

具体实现:

小结:

松耦合设计更加有弹性,更能应对变化。

返回顶部

3. Decorator Pattern 装饰模式

装饰模式,动态地给一个对象添加一些额外的职责。

解析:

  不管是ConcreteComponent还是Decorator,亦或是ConcreteDecoratorABC,他们都继承来自于Component,所以所有的一切都相当于是对Component功能的扩展,这也就是装饰模式的意义。

实例解析1:

解析:

  详细解释:C#学习笔记-装饰模式

  只需要注意一点:服饰作为装饰品,需要专门记住他需要装饰的对象,不然装饰就没有任何意义了。

实例解析2:

  我们现在来做饮料,每一种饮料有不同的配料,每一种配料价格不一样,名字不一样,例如:现在顾客想要一杯加了奶泡和摩卡的深烘焙,我们需要得到各种搭配的饮料的价格。

解析:

  首先具体的饮料例如上面说的“深烘焙”在这里就是具体的Component了,那些奶泡或者摩卡都是为了修饰他而存在的,所以同理,奶泡和摩卡之类就是ConcereteDecoratorABC了。仍然要注意的是奶泡那些不许携带他们需要修饰的对象Beverage,不用指定具体修饰的哪一种Beverage,但是必须有需要修饰的对象。

具体实现:

  

小结:

好的代码是对扩展开放,对修改关闭。

返回顶部

4. Factory Pattern 工厂模式

返回顶部

4.1 FactoryPattern工厂模式

工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。

解析:

  需要注意的是:工厂方法必须要返回一个Product类型的对象,因为工厂方法的唯一的作用就是实例化一个Product。

实例解析1:

  写一个简单的计算机。

解析:

  将计算中的加减乘除分为四个类,这样可以相互不干扰,但是都继承于计算这个类,然后建立OperationFactory来通过用户传输进来的符号来判断到底我们需要调用那种计算方式,也就是实例化哪一种类。

具体实现:

  详细解释:C#学习笔记-工厂模式

实例解析2:

  我们现在开披萨连锁店,在纽约、芝加哥和加州开披萨连锁店,不同的地区根据当地人的口味设计不同味道的同披萨。

解析:

  现在作为客人的我们要选择披萨的时候,店家首先需要根据我们的选择来确定是哪个地区的哪种风味的披萨,所以这个时候需要实例化的就是根据选择的披萨来实例化该地区的那种风味的披萨。

具体实现:

小结:

设计原则:依赖抽象,不要依赖具体类。

返回顶部

4.2 AbstractFactoryPattern抽象工厂模式

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指出具体类。

解析:

  抽象工厂模式与工厂模式的区别在于,工厂模式只是创建一个产品,而抽象工厂模式是创建产品家族,并让制造的产品集合起来使用。

  所以抽象工厂模式需要一个大的接口AbstractFactory,而他具体的实现ConcreteFactory12345里面的具体实例化可以调用工厂模式。

实例分析1:

解析:

  这里的数据库不定,表单数不定,但是彼此之间都可能存在关系,所以可以调用抽象工厂模式将这一系列的产品想关联起来。

  具体实现:C#学习笔记-抽象工厂模式

实例分析2:

  现在我们建立一个工厂来生产原料;这个工厂将负责创建原料家族中的每一种原料,为披萨店提供原材料

解析:

  我们订购了pizza后,商店自己根据当前订购的pizza获得当前需要在哪家店订购披萨,然后当地的pizza在从当地的原料工厂获得制作pizza 的原料,如此来制作披萨。

具体实现:

  这里的原料家族生成各种各样的产品,再通过不同的组合组成,组成我们所需要的披萨,所以这个部分我们需要调用抽象工厂模式。

小结:

抽象工厂模式创建产品家族,工厂模式创建一个产品。

返回顶部

总结:

温故而知新

成长就是不断发现以前的自己是个傻逼

备注:源代码示例My Github

设计模式复习小结一(Strategy Pattern/Observer Pattern/Decorator Patter/Factory Pattern)的更多相关文章

  1. why factory pattern and when to use factory pattern

    1 factory pattern本质上就是对对象创建进行抽象 抽象的好处是显然的,可以方便用户去获取对象. 2 使用factory pattern的时机 第一,当一个对象的创建依赖于其它很多对象的时 ...

  2. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  3. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  4. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  5. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  6. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  7. 【设计模式】简单工厂模式 Simple Factory Pattern

    简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...

  8. C++设计模式 之 “组件协作”模式:Template Method、Strategy、Observer

    “组件协作”模式: #现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式. #典型模式: Templ ...

  9. 设计模式之工厂模式(Factory Pattern)

    一.什么是工厂模式? 1.“简单工厂模式”,Simple Factory Pattern 也就是常用的在Factory类中定义静态方法负责new对象的方式. 摘要中提到过“严格地说,这种被称为“简单工 ...

随机推荐

  1. 安卓中級教程(8):pathbutton中的animation.java研究(1)

    src/geniuz/myPathbutton/myAnimations.java package geniuz.myPathbutton; import java.util.ArrayList; i ...

  2. Fast 迅捷网络 无线路由器FW323的功能设置

    一.问题的提出 1.有一个无线路由器,型号:Fast 迅捷网络 无线路由器FW323 2.有三个网络层级,第一级,用一个路由器A负责对接互联网,内网IP段为192.168.1.*,网关设置192.16 ...

  3. PHP session 跨子域问题

    今天,做项目时候遇到个问题.之前做东西的时候session一般就直接存在数据库中这样就能解决跨域 不仅仅是跨子域,但是今天遇到这个问题是,自己要在别人现有的东西上面做修改.由于仅仅是子域 当时就行肯定 ...

  4. UBUNTU查看软件版本

    1.查看已安装软件版本aptitude show softwarename 2.查看软件安装目录dpkg -L softwarename

  5. 深入了解JavaScript中的关键字

    this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分四种情况,详细讨论this的用法,感兴趣的朋友可以了解下. this是Javascri ...

  6. Sql面试常考题(持续添加)

    最近萌生换工作的念头,于是上网下载了一些公司的面试题,重新看了面试题中的Sql部分,这些查询题有时候只是兜一个弯角来考,对于给EF惯坏的孩子来说还是有点难度的(给面试官鄙视了几下的结果),所以列出最近 ...

  7. Arrays类学习笔记

    Arrays.asList(arr); 该方法可以把数组变成List集合. String[] arr = {"abc","cc"}; List<Strin ...

  8. 201521123049 《JAVA程序设计》 第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  9. [HNOI2015]接水果

    题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...

  10. urlconnection代码

    package com.yucheng.connection; import java.io.BufferedReader; import java.io.InputStream; import ja ...