软件工程与设计模式
草根_USTC
不要追一匹马,你用追马的时间去种草,待春暖花开时,能吸引一批骏马来供你选择;不要刻意巴结一个人,用暂时没有朋友的时间去提升自己的能力,待时机成熟时,便有一批朋友与你同行;用人情做出来的朋友只是暂时的,用人格做出来的朋友是长久的。所以,丰富自己比取悦别人更有力量。种下梧桐树,引得凤凰来;你若盛开,蝴蝶自来。你若精彩,天自安排。 ——屠呦呦
展开
-
重点推荐:设计模式学习资料
史上最全设计模式导学目录(完整版)http://blog.csdn.net/lovelion/article/details/17517213原创 2017-02-19 18:01:51 · 495 阅读 · 0 评论 -
备忘录模式(Memento Pattern)
模式动机:1、为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取出即可回到之前的状态。2、现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z,目的就是为了解决这个后悔的问题。3、在应用软件的开发过程中,很多时候我们都需要记录一个对原创 2012-07-30 16:58:04 · 381 阅读 · 0 评论 -
中介者模式(Mediator Pattern)
模式动机:1、在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:1)系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理。2)对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职原创 2012-07-29 11:56:48 · 410 阅读 · 0 评论 -
迭代器模式(Iterator Pattern)
模式动机:1、一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。2、针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口中充斥着各种不同遍历的操作。3、怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式,这就是迭代器模式所要解决的问题。原创 2012-07-28 15:34:17 · 379 阅读 · 0 评论 -
命令模式(Command Pattern)
模式动机:1、在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。2、命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而原创 2012-07-26 15:03:41 · 301 阅读 · 0 评论 -
责任链模式(Chain Of Responsibility Pattern)
行为模式概述1、行为型模式(BehavioralPattern)是对在不同的对象之间划分责任和算法的抽象化。2、行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。3、通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行原创 2012-07-25 20:12:44 · 425 阅读 · 0 评论 -
代理模式(Proxy Pattern)
模式动机:1、在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。 2、通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过原创 2012-07-25 12:13:22 · 370 阅读 · 0 评论 -
享元模式(Flyweight Pattern)
模式动机:1、面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。2、享元模式正是为解决这一类问题而诞生的。享元模式通过共享技术实现相同或相似对象的重用。3、在享元模式中可以共享的相同内容称为内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为外部原创 2012-07-24 16:23:19 · 1595 阅读 · 0 评论 -
外观模式(Facade Pattern)
模式动机:引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。 模式动机:外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式原创 2012-07-24 10:15:53 · 396 阅读 · 0 评论 -
装饰模式(Decorator)
模式动机: 一般有两种方式可以实现给一个类或对象增加行为:1、继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。2、关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(De原创 2012-07-23 14:35:18 · 342 阅读 · 0 评论 -
组合模式(Composite Pattern)
模式动机:1、对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象,如子文件夹和文件)并调用执行。(递归调用)2、由于容器对象和叶子对象在功能上的区别,在使用这些对象的客户端代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使得程序原创 2012-07-21 14:22:52 · 498 阅读 · 1 评论 -
访问者模式(Visitor Pattern)
模式动机:1、对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生。2、在实际使用时,对同一集合对象的操作并不是唯一的,对相同的元素对象可能存在多种不同的操作方式。3、而且这些操作方式并不稳定,可能还需要增加新的操作,以满足新的业务需求。4、此时原创 2012-07-31 23:34:27 · 694 阅读 · 0 评论 -
观察者模式(Observer Pattern)
模式动机:1、建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。 模式意图:观察者模式(Observer Pattern):定义对原创 2012-07-31 09:53:12 · 678 阅读 · 0 评论 -
TortoiseSVN 冲突解决详细步骤 (图)
冲突还是很好解决的,但我没有试过在IDE里边集成怎样。记得VSS在Visual Studio里边解决冲突就非常完美,冲突自动报告,自动弹出冲突解决窗口,让你处理该怎么合并两份版本。合并后自动签入commit。小乌龟在这里就欠缺点了~~~1.发现冲突。大家不要惊慌~~~~ 2.按照提示update。警察叔叔叫你update就update啦~~u转载 2013-07-20 14:10:32 · 1107 阅读 · 0 评论 -
SVN:回滚代码
发现自己提交错了代码如果把错误的代码回滚掉其实操作非常简单,大家一看就会了。第一步:将最新的代码下载到本地工作拷贝并保证目录是干净的(本地没有做过任何修改)第二步:右键show log第三步:执行回滚操作方法一: 右键选中正确的历史版本执行"Revert to this revision",意思是回滚到这个版本,也就是说这个版本以后所有的变更都会被删除。方法二:选中转载 2014-07-30 12:15:29 · 599 阅读 · 0 评论 -
TortoiseSVN中Branching和Merging实践
使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到分支的管理,也不敢贸然使用合并功能,生怕合并出了问题对团队造成不良影响,最主要的原因是,自己对分支的目的和合并的方法不甚了解,这才是硬伤。最近由于适配机型的需要(本人从事手机客户端的开发),需要经常接触分支和合并两项工作,突然发现这玩意整不明白很难开展工作,遂这两天着重研究了一下,有点收获,怕以后转载 2013-12-04 18:02:41 · 504 阅读 · 0 评论 -
Eclipse编辑器基本设置
http://www.cnblogs.com/decarl/archive/2012/05/15/2502084.html转载 2014-01-17 09:34:42 · 523 阅读 · 0 评论 -
MVVM Light
MVVM Light (Part 1):http://www.cnblogs.com/yanxiaodi/archive/2011/12/22/2297579.htmlMVVM Light (Part 2):http://www.cnblogs.com/yanxiaodi/archive/2011/12/22/2297698.htmlMVVM Light (Part 2转载 2013-07-20 22:42:15 · 652 阅读 · 0 评论 -
TortoiseSVN使用简介
TortoiseSVN使用简介 转载网址:http://www.uml.org.cn/pzgl/200904246.asp#2转载 2013-07-03 13:12:32 · 468 阅读 · 0 评论 -
模版方法模式(Template Method Pattern)
模式动机:1、模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。2、在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不原创 2012-08-01 21:40:48 · 363 阅读 · 1 评论 -
解释器模式(Interpreter Pattern)
模式动机:1、如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题。2、解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。 模式意图:解释器模式(Interpreter Pattern):定义语言的文法,并且建立一个解释器来原创 2012-08-01 17:12:45 · 445 阅读 · 0 评论 -
策略模式(Strategy Pattern)
模式动机:1、完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。2、在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。3、在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法是硬编码(HardCo原创 2012-07-31 19:55:55 · 334 阅读 · 0 评论 -
状态模式(State Pattern)
模式动机:1、在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。2、在UML中可以使用状态图来描述对象状态的变化。 模式意图:原创 2012-07-31 16:00:55 · 393 阅读 · 0 评论 -
桥接模式(Bridge Pattern)
模式动机:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:1、第一种设计方案是为每一种形状都提供一套各种颜色的版本。2、第二种设计方案是根据实际需要对形状和颜色进行组合。 对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便原创 2012-07-20 20:46:28 · 2313 阅读 · 0 评论 -
适配器模式(Adapter pattern)
适配器模式(Adapter pattern)我们已经结束创建型模式讲解,接下来开始结构型模式讲解。 结构型模式概述:结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。 根据这一点,结构型模式可以分为类结构型模式和对象结构型模式:1、类结构型模式关心类的组合,由原创 2012-07-19 12:14:52 · 427 阅读 · 0 评论 -
Observer (C++实现)
<br />// Observer.cpp : 定义控制台应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include <iostream><br />#include <list><br />#include <algorithm><br /> <br />using namespace std;<br /> <br />typedef int STATE;<br /> <br />class Observer;<br /><br />class Sub转载 2011-06-01 12:22:00 · 461 阅读 · 0 评论 -
Command (C++实现)
// Command.cpp : 定义控制台应用程序的入口点。///*该实现为最简单方式。*/#include "stdafx.h"#include using namespace std;class Command{public : Command() { } virtual~ Command() { } virtual void Execute()=0;};class Receiver{public: Receiver() { } virtual ~Receiver() { } void Action原创 2011-05-29 20:38:00 · 380 阅读 · 0 评论 -
Flyweight (C++实现)
// Flyweight.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;typedef string STATE;class Flyweight{public: STATE GetIntrinsicState() { return m_state; } virtual void Operation(STATE& Extrinsic)=0;protected: Flyweight原创 2011-05-26 21:55:00 · 357 阅读 · 0 评论 -
Facade (C++实现)
<br />// Facade.cpp : 定义控制台应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include <iostream><br />using namespace std;<br />class ServiceClass<br />{<br />public:<br /> ServiceClass()<br /> {<br /> cout<<"Construction of ServiceClas"<<endl;<br /> }<br /原创 2011-05-26 14:25:00 · 395 阅读 · 0 评论 -
Decorator (C++实现)
// Decorator.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;class Component{public: Component() { } virtual ~Component() { } virtual void Operation()=0;};class ConcreteComponent :public Component{public: ConcreteComponent() { cout }原创 2011-05-25 18:18:00 · 396 阅读 · 0 评论 -
Composite (C++实现)
<br />// Compisite.cpp : 定义控制台应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include <iostream><br />#include <list><br />#include <algorithm><br />using namespace std;<br /> <br />class Componet<br />{<br />public:<br /> Componet()<br /> {<br /> }<br />转载 2011-05-24 22:35:00 · 490 阅读 · 0 评论 -
Singleton (C++实现)
<br />// Singleton.cpp : 定义控制台应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include <iostream><br />using namespace std;<br /><br />class Singleton<br />{<br />public:<br /> Singleton(){}<br /> virtual ~Singleton(){}<br /> <br /> static Singleton* GetIn转载 2011-05-23 10:17:00 · 355 阅读 · 0 评论 -
Bridge (C++实现)
<br />// Bridge.cpp : 定义控制台应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include <iostream><br />using namespace std;<br />class Implementor<br />{<br />public: <br /> Implementor()<br /> {<br /> }<br /> virtual ~ Implementor()<br /> {<br /> }<br转载 2011-05-23 17:08:00 · 405 阅读 · 0 评论 -
Builder (C++实现)
<br />// Builder.cpp : 定义控制台应用程序的入口点。<br />//<br />#include "stdafx.h"<br />#include <iostream><br />using namespace std;<br /><br />/////////////////////////////////////////////////<br />class Builder<br />{<br />public:<br /> Builder(){ }<br /> virtual ~原创 2011-05-22 11:03:00 · 354 阅读 · 0 评论 -
Factory Method (C++实现)
// Factory Method.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;//////////////////////////////////////////class Product{public: Product(){} virtual ~Product(){}};class ConcreteProductA:public Product{ public: ConcreteProductA() {原创 2011-05-21 23:48:00 · 639 阅读 · 0 评论 -
Strategy (C++实现)
// Strategy.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;class Strategy;class Context{public: Context(Strategy *pStrategy=NULL):m_pStrategy(pStrategy) { } ~Context() { } void ContextInterface(); void setStrategy(Strategy* s) { m_p转载 2011-06-02 23:41:00 · 280 阅读 · 0 评论 -
Visitor (C++实现)
// Visitor.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;class Visitor;class Element{public: virtual ~Element(){} virtual void Accept(Visitor &rVisitor) = 0;原创 2011-06-03 10:31:00 · 379 阅读 · 0 评论 -
单例模式(Singleton pattern)
动机:对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个原创 2012-07-18 11:17:42 · 366 阅读 · 0 评论 -
原型模式(Prototype Pattern)
动机:有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原型模式的动机。 意图:原型模式(Prototype Pattern):它是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无需原创 2012-07-17 15:38:57 · 362 阅读 · 0 评论 -
建造者模式(Builder pattern)
动机:在某些情况下,一个对象会有一些重要的属性,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。在某些情况下,一个对象的一些属性必须按照某个顺序赋值才有意义。在某个属性没有赋值之前,另一个属性则无法赋值。此时,对象相当于一个有待建造的产品,而对象的属性相原创 2012-07-16 10:15:05 · 312 阅读 · 0 评论