UML与设计模式
xiangjie256
这个作者很懒,什么都没留下…
展开
-
桥接模式(Bridge)
桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的对象去使用具体实现部分的对象[img]http://dl2.iteye.com/upload/attachment/0101/5270/a67ee887-b48e-38f4-9c95-720a7fc0ead5.png[/img][code="c++"]#include using namespace std;...原创 2014-09-26 15:34:24 · 119 阅读 · 0 评论 -
迪米特法则
迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用.它强调在类的结构设计上,每一个类都应当尽量降低成员的访问权限.迪米特法则其根本思想是强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及...原创 2014-07-19 18:23:01 · 74 阅读 · 0 评论 -
原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象一般在初始化的信息不发生变化的情况下,克隆是最好的办法.这即隐藏了对象创建的细节,又对性能是大大的提高,它等于是不用重新初始化对象,而是动态地获得对象运行时的状态浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象深复制:把引用对象的变量指向复制过的新对象...原创 2014-07-16 20:34:47 · 85 阅读 · 0 评论 -
里氏代换
里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别.也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化.简单来说,子类型必须能够替换掉它们的父类型.只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为....原创 2014-07-12 09:43:59 · 90 阅读 · 0 评论 -
依赖倒转
依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对接口编程,不要对实现编程高层模块不应该依赖低层模块.两个都应该依赖抽象抽象不应该依赖细节.细节应该依赖抽象...原创 2014-07-12 09:39:38 · 93 阅读 · 0 评论 -
开放-封闭原则
开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展,但是不可修改.即:对扩展是开放的,对于更改是封闭的无论模块是多么的'封闭',都会存在一些无法对之封闭的变化.既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择.他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化开放-封闭原则是面向对象设计的核心所在.遵循这个原则可以带来面向对象技术...原创 2014-07-12 09:33:57 · 104 阅读 · 0 评论 -
单一职责
单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力.这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏.当然软件设计真正要做的许多内容,就是发现职责并把那些职业相互分离.其实要去判断是否应该分离出类来,也不难,那就是如果你能够想到多于一个的...原创 2014-07-12 09:26:42 · 73 阅读 · 0 评论 -
MVC
MVC是一种复合模式,结合了观察者,策略模式和组合模式。要点:1.模型使用观察者模式,以便观察者更新,同时保持两者之间解耦。2.控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。3.视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板,框架和按钮。4.这些模式携手合作,把MVC模型的三层解耦,这样可以保持设计干净又有弹性。5.适配器模式用来...原创 2011-07-21 17:32:49 · 95 阅读 · 0 评论 -
代理模式(Proxy)
代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问。(为其它对象提供一种代理以控制对这个对象的访问)要点:1.远程代理管理客户和运程对象之间的交互2.虚拟代理控制访问实例化开销大的对象3.保护代理基于调用者控制对象方法的访问4.代理模式有许多变体,例如:缓存代理,同步代理,防火墙代理和写入时复制代理5.代理在结构上类似装饰者,但是目的不同6.装饰者模...原创 2011-07-19 15:47:25 · 108 阅读 · 0 评论 -
外观模式(facade)
外观模式(facade):为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层,业务逻辑层和表示层的层与层之间建立外观facade在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,...原创 2014-07-20 09:31:02 · 86 阅读 · 0 评论 -
建造者模式(Builder)
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;它是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式.[img]http://dl2.iteye.com/upload/attachment/0100/8177/bc3b6f38-34b5-3aaa-a402-f8b96131c24f.png[/img]...原创 2014-07-23 20:45:45 · 85 阅读 · 0 评论 -
事件委托(delegate)
委托机制的本质就是调用成员函数的函数指针,实现回调委托就是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值.委托可以看作是对函数的抽象,是函数的"类".委托的实例将代表一个具体的函数.一个委托可以搭载多个方法,所有方法被依次唤起.它可以使得委托对象所搭载的方法并不需要属于同一个类.但委托对象所搭载的所...原创 2014-07-23 20:53:49 · 136 阅读 · 0 评论 -
访问者模式(Visitor)
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化.简单来说就是让visitor来类的内部进行一些数据的操作[code="c++"]#include using namespace std;cl...原创 2014-08-03 13:59:11 · 94 阅读 · 0 评论 -
解释器模式(interpreter)
解释器模式(interpreter),给定一个语言,定义它的方法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题...原创 2014-08-03 13:55:28 · 98 阅读 · 0 评论 -
享元模式(Flyweight)
享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象.享元模式可以避免大量非常相似类的开销.在程序设计中,有时需要生成大量细粒度的类实例来表示数据.如果能发现这些实例除了几个参数外基本都是相同的,有时就能够受大幅度地减少需要实例化的类的数量.如果能把那些参数移到类实例的外面,在方法调用 时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目.如果一个应用程序使...原创 2014-08-02 09:31:13 · 77 阅读 · 0 评论 -
中介者模式(Mediator)
中介者模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合[img]http://dl2.iteye.com/upload/attachment/01...原创 2014-08-02 09:26:26 · 107 阅读 · 0 评论 -
职责链模式(Responsibility)
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止[img]http://dl2.iteye.com/upload/attachment/0101/0396/ebd5e75c-d62d-30fe-80fd-fc17d98ea025.p...原创 2014-07-31 20:36:51 · 97 阅读 · 0 评论 -
合成/聚合利用原则
合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承聚合表示一种弱的'拥有'关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分合成则是一种强的'拥有'关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样...原创 2014-07-29 20:56:07 · 184 阅读 · 0 评论 -
组合模式(Composite)
组合模式(Composite):将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式...原创 2014-07-27 10:15:17 · 77 阅读 · 0 评论 -
备忘录模式(Memento)
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态.[code="c++"]#include #incl...原创 2014-07-26 09:09:17 · 85 阅读 · 0 评论 -
状态模式(State)
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化.要点:1.状态模式允许一个对象基于内部状态而拥有不同的行为2.和程序状态机(PSM)不同,状态模式用类代表状态3.Context会将行为委托给当前状态对象...原创 2011-07-13 17:33:40 · 172 阅读 · 0 评论 -
迭代器模式(Iterator)
迭代器模式:提供一种方法顺序访问一个聚合中的各个元素,而又不暴露其内部表示。要点:1.迭代器允许访问聚合的元素,而不需要暴露它的内部结构。2.迭代器将遍历聚合的工作封装进一个对象中3.当使用迭代器的时候,我们依赖聚合提供遍历4.迭代器提供了一个通用的接口,让我们遍历聚合的项时,就可以使用多态机制5.我们应该努力让一个类只分配一个责任6.组合模式提供一个结构,可同时包...原创 2011-07-09 15:57:19 · 87 阅读 · 0 评论 -
时序图
时序图将交互关系表示为一个二维图形,垂直方向为时间轴,时间沿竖线向下延伸;水平方向为对象维,排列的是协作中各独立对象的类元角色-对象。时序图强调的是消息发送的时间顺序。它由活动者(Actor),对象(Object),消息(Message),生命线(LifeLine)和控制焦点(Focus of control)组成。同步消息=调用消息:消息的发送者把控制传递给消息的接收者,然后停止...原创 2011-06-19 14:55:40 · 127 阅读 · 0 评论 -
策略(stragety)模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。设计原则:封装变化,针对接口编程[img]http://dl.iteye.com/upload/attachment/501077/d93bc9bb-6f5b-33c5-a539-c74c2fe0295c.png[/img]Stragety.h[code="c++"]...原创 2011-06-18 13:13:46 · 227 阅读 · 0 评论 -
活动图
活动图可以用于描述系统的工作流程和并发行为,它用于展现参与行为的类所进行的各种活动的顺序关系。泳道是活动图中水平方向的区域划分,根据每个活动的职责对所有活动进行划分,每个泳道代表一个责任区。[img]http://dl.iteye.com/upload/attachment/500187/96bd5305-a853-3f67-a4e3-5f74f44d897e.png[/img]...原创 2011-06-17 10:50:13 · 80 阅读 · 0 评论 -
状态图
状态机是展示状态和状态转换的图,是一个类的对象所有可能的生命历程的模型。状态机由状态,转换,事件,活动和动作5部分组成。1.状态:对象执行某巩活动或等待某个事件时的条件,表示一个模型在其生存期内的状况,一个状态的生存期是一个有限的时间段。2.转换:两个不同状态之间的联系,它由某个事件触发,然后执行特定的操作或评估并导致特定的状态结束。3.事件:在某个时间发生,可以触发状态转换...原创 2011-06-16 10:15:20 · 121 阅读 · 0 评论 -
类图与对象图
类名:1.把类名的每个单词首字母大写,放在矩形的上部2.正体字是可被实例化,斜体说明类是抽象类类的属性第一个单词的属性名小写,后面的单词首字母大写可见性:"+"表示公有操作,“#”表示受保护操作,“-”表示私有操作聚合:整体与部分。如:汽车-车轮组合:子类的生命周期依赖于父类的生命周期。如:汽车厂-汽车[img]http://dl.iteye.c...原创 2011-06-15 11:19:10 · 94 阅读 · 0 评论 -
用例图
用例:在不展现一个系统或子系统内部结构的情况下,对系统或子系统的某个连贯的功能单元的定义和描述。用例是对包括变量在内的一组动作序列的描述,系统执行这些动作,并产生传递特定参与者的可观察结果。参与者是系统外部的一个实体,它以某种方式参与了用例的执行过程,通过向系统输入或请求系统输入某些事件来触发系统的执行。[img]http://dl.iteye.com/upload/attachm...原创 2011-06-14 12:15:38 · 122 阅读 · 0 评论 -
UML中的关系
关联(association):连接元素和链接实例,它用连接两个模型元素的实线表示,在关联的两端可以标注双方的角色和多重性标记。[img]http://dl.iteye.com/upload/attachment/497923/fa5e4539-6fb9-3207-b2fc-a6027331f5f4.png[/img]依赖(dependency):描述一个元素对另一个元素的依赖,依赖关...原创 2011-06-14 10:24:50 · 136 阅读 · 0 评论 -
UML中的图
用例图(use case):从用户角度描述系统功能,并指出各功能的操作者,帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的“角色”关系,以及系统内用例的关系。类图(class):显示一组类,接口的协作,以及它们之间的关系,显示了系统的静态结构。对象图(object):描述系统在某个时刻的静态结构,显示的是类的多个对象实例而非类。状态图(state):某个...原创 2011-06-14 10:17:26 · 78 阅读 · 0 评论 -
观察者(Observer)模式
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新.松耦合:两个对象松耦合时,它们依然可以交互,但并不太清楚彼此的细节,相互依赖很低,这样可以建立有弹性的OO系统,应对变化.要点:1.观察者模式定义了对象之间一对多的关系2.主题用一个共同的接口来更新观察者3.观察者和可观察者之间用松耦合结合,可观察者不知道观察者...原创 2011-06-20 23:33:27 · 108 阅读 · 0 评论 -
协作图
协作图是一种交互图,是动态视图的另一种表现形式,强调的是发送和接收消息的对象之间的组织结构与交互,而时序图则是系统与环境的交互。协作:描述了在一定的语境中一组对象,以及用以实现某些行为的这些对象间的相互作用。交互:是协作的一个消息集合,这些消息被类元角色通过关联角色交换。元素[img]http://dl.iteye.com/upload/attachment/50186...原创 2011-06-21 11:00:25 · 73 阅读 · 0 评论 -
组件图
组件图是一个架构师在项目的初期就建立的非常重要的图,它的主要目的是显示系统组件间的结构关系组成元素:1.组件:也叫构件,是系统中遵从一组接口并提供其实现的物理的,可替换的部分,是定义了良好接口的软件模块,如源代码,二进制代码,可执行文件,以及动态连接库等。2.接口:一个类提供给别一个类的一组操作3.关系:实现与依赖[img]http://dl.iteye.com/u...原创 2011-06-23 10:46:14 · 122 阅读 · 0 评论 -
模板方法模式(Template)
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理.钩子(hook):是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算...原创 2011-07-07 15:36:53 · 82 阅读 · 0 评论 -
适配器模式(Adapter)
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间.对象适配器:使用组合类适配器:使用多继承外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。要点:1.当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器2.当需要简化并统一一个很大的接口或者一群很复杂的接...原创 2011-07-05 15:32:28 · 76 阅读 · 0 评论 -
命令模式(Command)
命令模式:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。支持可撤销操作。要点:1.命令模式将发出请求的对象和执行请求的对象解耦2.在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作3.调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用4.调用者可以接收命令当做参数,甚至在运行时动态地进行...原创 2011-07-01 16:22:52 · 196 阅读 · 0 评论 -
单 例(Singleton)
单例模式:确保一个类只有一个实例,并提供一个全局访问点。这些类比如包括:线程池,缓存,对话框,处理偏好设置,注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。要点:1.单例模式确保程序中一个类最多只有一个实例2.单例模式也提供访问这个实例的全局点3.确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程问题4.如果使用多个类加载器,可能导致单...原创 2011-06-28 16:28:43 · 75 阅读 · 0 评论 -
抽象工厂(Abstract Factory)
抽象工厂模式:提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这样客户就可以从具体的产品中被解耦.要点:1.抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中2.抽象工厂创建相关的对象家族,而不需要依赖它们的具体类关于简单工厂,工厂,抽象工厂的区别,从网上找到一个比较好的实例:1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了....原创 2011-06-26 16:31:28 · 82 阅读 · 0 评论 -
简单工厂与工厂模式(Factory)
简单工厂并不是一个“真正的“模式,可以把它当作一种编程习惯。它的最大优点在于工厂类中包含必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖工厂方法模式:定义了一个创建对象的接口,但由于类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。要点:1.所有的工厂都是用来封闭对象的创建2.简单工厂,虽然不是真正的设计模式,但仍不失...原创 2011-06-26 16:10:53 · 158 阅读 · 0 评论 -
装饰者模式(Decorator)
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活要点1.继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式2.应该允许行为可以被扩展,而无须修改现有的代码3.组合和委托可用于在运行时动态地加上新的行为4.装饰者模式意味着一群装饰者类,这些类用来...原创 2011-06-24 00:20:41 · 89 阅读 · 0 评论