期末作业系列之设计模式

背景

又是一年的期末,今年大三上学期的设计模式作业是:运用5个以上的设计模式创建一个系统。(这里我问了一下老师,老师说反正就是要5个以上联系在一个project里的就行了嘿嘿嘿。)
作为一个平时不认真学习的“大学生”,现在开始进行“面向结果型学习”。首先我看了一会书,emmm,400页左右,好吧,百度走起!
这里先放一下参考和借鉴的地址:
https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html(这个他是转载的,里面有原文地址,但是他把原本那个3合1了)
http://blog.csdn.net/grp3143167/article/details/51124384

一定要结合目录使用还有搜索功能CTRL+F,提高自己的查询效率。建议先从使用场景看起。

正式开始

如果想快速的完成这个作业,我想到应该把他们的职能和联系先找出来:再结合实际可以挑着用。

看了几个网站这里都是给纯中文的,作为一个对设计模式没什么印象的同学,这个对下图设计模式之间的联系不好理解,所以这里我加上了对应的英文!

创建型模式,共五种:工厂方法模式(factory method)、抽象工厂模式(abstarct factory)、单例模式(singleton)、建造者模式(builder)、原型模式(prototype)。

结构型模式,共七种:适配器模式(adapter)、装饰器模式(decorator)、代理模式(proxy)、外观模式(facade)、桥接模式(bridge)、组合模式(composit)、享元模式(flyweight)。

行为型模式,共十一种:策略模式(strategy)、模板方法模式(template)、观察者模式(observe)、迭代器模式(iterator)、责任链模式(chain of responsibility)、命令模式(command)、备忘录模式(memento)、状态模式(state)、访问者模式(visitor)、中介者模式(mediator)、解释器模式(interpreter)。

这里写图片描述

接下来就是看看各个模式的定义了,我们还是按功能进行分类

各种设计模式的基本定义和实现方式

创建型:
基础:简单工厂模式

--简单创建:一个工厂类负责对实现的同一接口的一些类进行实例的创建。(传递相关类型名字符串来区分创建的类)
--个性化创建:在简单的基础上,工厂类对每个类实现一个创建方法。(个性化)(多个方法)
--静态个性化创建:在个性化创建的基础上,工厂类的方法设置为类的静态方法(static)。(多个静态方法)

-工厂方法模式(Factory Method):解决简单工厂模式在扩展的时候必须修改工厂类、违背开闭原则。(简单工厂模式类的创建依赖于工厂类)(扩展性好)(支持新增产品)

实现描述:定义一个工厂类接口,对每一个产品类创建一个工厂类。

–抽象工厂模式(Abstract Factory):对产品簇的扩展支持(不支持新增产品,可新增产品簇)

实现模式:定义一个工厂类接口,多个产品抽象接口。(产品簇)

–单例模式(Singleton):提供唯一对象(创建对象过多时)(减压)(对象只能唯一)

实现模式:内部类生成private static 对象,通过public static方法对外提供(内部类实现)

–建造者模式(Builder):创建一个复杂对象,使创建流程和发杂对象各部分的具体创建过程分离。

实现模式:定义一个建造者接口Builder,一个导演类Director持有建造者Builder接口,通过该接口调用具体建造者ConcreteBuilder类中的方法,从而构造出复杂的Product对象。

–原型模式(Prototype):对象的克隆。(从堆内存以二进制流的方式进行拷贝,适用于在循环体内产生大量对象)

实现模式:实现Cloneable接口,重写Object类的clone方法。(数组、引用对象需要在方法体内实现克隆)

结构型
–适配器模式(Adapter):已有接口和定义接口不匹配。(类的适配器模式和对象的适配器模式)

实现描述:类适配(原始类A有一方法funcA,接口faceA需要实现funcA、funcB,实现一个适配类B继承与A实现接口faceA)(解决接口内方法个数和原始类方法不匹配)

对象适配(将类适配中A和B的关系从继承,改变为B持有A的实例对象)(解决原始类方法和已有接口方法的命名不匹配和个数不匹配)

接口适配(桩问题)对于接口,引申出两个概念:标识接口(没有声明任何方法的接口)和桩(实现了接口,但是实现方法体为空的类)。

标识接口:用来标识某个类符合一定的规范。(对于有人制定规则的前提下,这种标识非常有用,如何不遵守这种规范,任意去实现自己的代码,将会给程序带来致命的错误)

桩:在一个接口里声明的一组方法,有的时候某些方法可能被忽略执行,或者返回值没有任何意义,可以定义一个桩,让具体的实现延迟到具体的子类。

–装饰模式(Decorator):扩展一个类功能。(动态的添加功能)

实现描述:原始类A定义有方法funcA,定义接口faceA有方法funcA,定义装饰类B持有A的实例对象、实现接口faceA。(旨在对原始类的扩展)

–代理模式(Proxy):代替原对象进行一系列操作。(对象的访问控制)(隐藏一个对象的具体信息)

实现描述:原始类A定义有方法funcA,定义接口faceA有方法funcA,定义装饰类B持有A的实例对象、实现接口faceA,客户程序通过接口faceA去调用A的funcA。(旨在封装原始类的复杂接口)

–外观模式(Facade):各组件类解耦,形成一个外观提供服务。(计算机类和各个组件类,为了防止各个组件之间的耦合,用计算机类持有各个组件的实例,避免了组件之间的关联)

实现描述:原始类A、B、C,定义外观类D持有A、B、C的实例对象。(旨在对A、B、C关系的解耦)

–桥接模式(Bridge):抽象化和实例化的解耦。

实现描述:定义接口faceA含funcA,定义桥接类A持有接口faceA的一个对象并实现funcA,funcA会根据一定的逻辑调用faceA的funcA,使实现接口faceA的各个类具体的逻辑实现和 接口的调用逻辑分离,客户程序调用A的方法funcA就可以调用相应的处理逻辑。

–组合模式(Composite):客户程序和复杂元素的内部结构解耦。(树节点和树)(部分整体模式)(像操作简单元素一样操作复杂元素)

实现描述:将复杂的组织结构以树的形式实现,简化对复杂数据结构的操作

–享元模式(Flyweight):已存在对象的共享。(共享池)(连接池)

实现描述:管理类持有实例对象的列表并管理这个列表,对外以工厂的模式提供对象。

行为型
-父类与子类

–策略模式(Strategy):让可互换算法的具体变化不影响到调用的客户端程序。(决定权在客户端程序)(由客户决定具体调用的算法)(客户程序不需要知道算法的具体变化和所需要的数据)

实现模式:一个抽象的算法接口,一个可有可无的提供辅助函数的抽象类,一群实现接口、继承抽象类的算法类,一个需要相关算法的客户端程序。

–模板方法模式(Template Method):算法公用部分放到父类,不同部分延迟到子类实现。(父类引用调子类方法)(没理解透)

实现模式:一个提供主方法的抽象类,一群继承抽象类的算法类,一个需要通过抽象类的引用调用具体方法的客户端程序。

-类之间

–观察者模式(Observer):两类接口存在依赖。(一方影响另一方)(一方监控另一方)

实现模式:一接口A依赖于另一个接口B,接口A的实现的变化影响B的实现(一个抽象类和他的子类),接口B的实现需要去监控A的动态并做出反应。

–迭代器模式(Iterator):聚合的遍历。

实现模式:聚合接口和迭代器接口,迭代器接口的实现持有聚合接口的引用,从而操作集体的聚合类型。

–责任链模式(Chain Of Responsibility):多个对象互相引用。(对用户程序隐藏具体调用的对象)

实现模式:一个类B继承于抽象类A、实现了接口funA,A持有funA的引用、可以去引用B的实例对象,客户程序通过B的实例对象调用相应操作。

–命令模式(Command):命令者和受令者的解耦。

实现模式:命令接口F,实现接口的命令类C,C持有最终完成命令的类R的引用,调用类I持有命令接口的引用。

-类的状态

–备忘录模式(Memento):备份对象状态,以便恢复。

实现模式:一个原始类A可以创建备忘录类B,存储类C持有B的实例用来存储备忘录。

–状态模式(State):状态不同,行为不同。

实现模式:原始类A持有状态类B的实例,A根据B的属性值去调用B的相应的具体方法。

-BY中间类

–访问者模式(Visitor):解决和元素类关系不大且频繁变动的操作的改变问题(来访问我吧)(扩展性:接收不同的访问者,操作的扩展)(符合单一职责)(外界调用元素接口引用)

实现模式:一个元素接口,一个访问者接口,元素接口接收访问者接口从而让其进行一些相关操作。

–中介者模式(Mediator):工作有关的工作者类之间的解耦。

实现模式:一个中介者接口,实现接口的中介者类,该类持有N个工作者类对象,并协调他们进行工作,抽象工作者类持有与之对应的中介者接口引用。(外界调用中介者接口引用)

–解释器模式(Interpreter):解释相关表达式。(扩展性好)(影响效率、性能,维护性复杂)(不建议轻易使用)(单一问题频度很大,可以考虑)

实现模式:表达式接口(非终结符表达式类和终结符表达式类),一个上下文环境Context类。
使用场景

加粗代表排除使用的一些面向期末作业不适用的设计模式。

创建型模式:
工厂方法模式(factory method):大量的产品需要创建,并且具有共同的接口时。
抽象工厂模式(abstarct factory):一个对象族(或者是一组没有任何关系的对象)都有相同的约束。
单例模式(singleton):内存中只存在一个对象的实例。
建造者模式(builder):组件创建整体,注重创建过程和细节。
原型模式(prototype):循环体内产生大量克隆对象。

结构型模式:
适配器模式(adapter):不同开发单位对类、接口命名差异。
装饰器模式(decorator):动态拓展类的功能。
代理模式(proxy):要代理或者叫做中介的场景。
外观模式(facade):为模块提供一个供外界访问的接口。
桥接模式(bridge):不希望使用继承或者接口不稳定的场景。
组合模式(composit):树状结构或局部-整体关系。
享元模式(flyweight):共享池、连接池相关。。

行为型模式:
策略模式(strategy):算法或行为相关的场景。
模板方法模式(template):多个子类公有方法并且逻辑基本相同;核心算法设计为模板方法,相关细节由子类实现;重构时。
观察者模式(observe):关联行为场景或者事件多级触发。
迭代器模式(iterator):需要实现迭代的场景(因为大多数都实现了iteratable接口,所以它现在已经没落了)
责任链模式(chain of responsibility):在隐瞒客户端的情况下,对系统进行动态的调整。
命令模式(command):你认为是命令就可以使用。
备忘录模式(memento):状态的保存和回滚。
状态模式(state):行为随状态改变或者条件、分支语句的代替者。
访问者模式(visitor):遍历多个不同对象。
中介者模式(mediator):调停者模式。一个中心调度。
解释器模式(interpreter):重复发生的问题,关于数据方面的。例如报表!

开始构想

工厂方法模式,看到这个工厂我就想到了工厂(。。。),那就模拟一个有关工厂的“系统”。首先工厂应该能生产零件,然后对零件进行组装,不管是零件还是成品都可以出售,除了直接销售应该还可以加个“代理”…….

最终版本

实现功能:
1.拟电脑公司向客户发送产品广告邮件。
2.拟电脑工厂制作CPU、显卡。
3.拟电脑的组装过程。
4.拟电脑的网上销售代理和直接拿货。

采用模式:
1.单例模式
2.原型模式
3.抽象工厂模式+模板方法模式
4.代理模式
5.策略模式

实现效果:
这里写图片描述

这里写图片描述

源代码:
http://download.csdn.net/download/saywhat_sayhello/10220998

  • 11
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值