文章分类 - 设计模式
摘要:设计模式;一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂。后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的“复杂”就在于它是要构造一个“万能钥匙”,目的是提出一种对所有锁的开锁方案。在真正理解设计模式之前我一直在编写“简单”的代码.这个“简单”不是功能的简单,而是设计的简单。简单的设计意味着缺少灵活性,代码很钢硬,只在这个项目里有用,拿到其它的项目中就是垃圾,我将其称之为“一次性代码”。-->要使代码可被反复使用,请用'设计模式
阅读全文
摘要:一、基本结构1.层次一:原始抽象类 抽象类:Cakeabstract class Cake { protected String description="Unknown Cake"; public abstract void printDescription();//抽象方法必须指定为abstract类型 }2.层次二:具体实现者、装饰者抽象类 具体实现者1:WhiteCakepublic class WhiteCake extends Cake { public WhiteCake() { description="WhiteCake"; } ...
阅读全文
摘要:本文将为您介绍12个优秀的UML工具:1. StarUMLStarUML(简称SU),是一种创建UML类图,是一种生成类图和其他类型的统一建模语言(UML)图表的工具。StarUML是一个开源项目之一发展快、灵活、可扩展性强(zj)。2. Netbeans UML Plugin目前支持:Activity图, Class图, Sequence图, State图以及Use Case图。3. AcceleoAcceleo是一个开源的代码生成器设计成让每个人都能把MDA方法运用到开发过程中并且能够提高软件的开发效率。Acceleo包含一组工具和编辑器使得它易于学习而且适合任何类型的技术。4. Argo
阅读全文
摘要:一、简单工厂模式的组成部分 a)抽象产品: 在接口中指定了每种具体产品需要实现的方法 具体产品: 实现接口 b)工厂类:根据具体的参数,创建和返回相应的具体产品,由主程序直接调用二、代码实现抽象产品:Carpackage com.simpleFactory;public interface Car { public void run();}具体产品1:BENZpackage com.simpleFactory;public class BENZ implements Car { public void run() { // TODO Auto-generat...
阅读全文
摘要:一、基本特点 如何防止创建多个实例:构造方法设置为私有,使得外部无法直接new出实例 基本组成:a)一个静态的和自身类型相同的成员对象 b)私有的构造方法 c)获取实例的公有方法,供外部调用,以返回实例 二、懒汉式特点:类被加载时不创建实例,getInstance方法第一次被调用时才创建实例类代码:public class LazySingleton { /** * 静态的和自身类型相同的成员对象 */ private static LazySingleton theLazySingleton=null; /** * 构...
阅读全文
摘要:一、 基本特点: a)根据不同的情况,创建不同的对象 b)每个对象方法名相同,方法的实现差别很大二、组成: a)抽象策略: 1个 b)具体策略 多个,封装了相关的算法和行为 c)调度类: 持有一个具体策略类的引用,供客户端使用三、代码实现:#include<iostream>usingnamespace std;/*************************************策略基类****************************************/ class StrategyBase//主要定义了虚函数 { public: virtua...
阅读全文
摘要:一、定义观察者类 a)观察者基类enum ObservedStatus {Dining, Sleeping, Working};/*******************************定义多个观察者类*************************************///定义观察者的父类(抽象类,实际作用相当于java中的接口)class Observer{ public: virtualvoid update(ObservedStatus status)=0; virtual~Observer() {}//保证父类指针指向子类时,delete基类指针,子类的析构行为能...
阅读全文
摘要:Prototype(原型模式)20.1.解释概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。main(),客户ICloneableNow,只有一个接口CloneCMail,实体类CAdvTemplate,说明:通过克隆的方式很快速的得到一个新的对象,然后稍微修改就是一个全新的对象了,节省了重新创建对象对资源的大量占用。Mediator(中介者模式)21.1.解释概念:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。main(),客户IAbstractMediator,中介者接口CMediator
阅读全文
摘要:19.1.解释概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。main(),客户CLiftState,电梯状态抽象类CCloseingState,电梯门关闭COpenningState,电梯门打开CRunningState,电梯运行CStoppingState,电梯停止CContext,电梯的控制面板说明:CContext保持电梯的状态,并提供操作的接口函数。当函数被调用时,CContext直接调用当前状态的相应函数。由状态的接口函数来确定是否可以执行这个动作,以及修改状态为执行这个动作后的状态。看代码:第一块是不使用模式的做法,第二块是使用模式的做法,在main
阅读全文
摘要:18.1.解释概念:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。main(),客户IVisitor,访问者接口CBaseVisitor,访问者实现类CEmployee,被访问者抽象类CCommonEmployee,被访问者实现类之一CManager,被访问者实现类之二说明:A接受B的访问,B主动的执行访问动作。注意:和观察者的区别是,被观察者要执行一个动作,然后主动发送通知给观察者。访问者模式是由访问者主动发出的动作。看代码://IVisitor.h#pragma onceclass CCommonEmployee;class CM
阅读全文
摘要:17.1.解释概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。main(),客户IWomen,发出请求者接口CWomen,请求者实现类CHandler,处理请求抽象类CFather,处理请求实现类,责任链之一CHusband,处理请求实现类,责任链之二CSon,处理请求实现类,责任链之三说明:CHandler抽象类负责聚合责任链之中的其它处理对象,用SetNext来建立这个责任链。HandleMessage在处理请求时,会判断是否是自己要处理的请求,如果是则直接处理。如果不是,则查找下一个责任
阅读全文
摘要:16.1.解释概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。main(),IObservable,被观察者接口CHanFeiZiObservable,被观察者韩非子IObserver,观察者接口CLiSiObserver,观察者李斯CZhouSiObserver观察者周斯说明:将观察者聚集到被观察者韩非子身边,韩非子的每一个举动都会通知给观察者,如李斯或周斯。注意:最多允许一个对象既是观察者也是被观察者。就像数据库中的触发器一样,成为一个复杂的链就很难维护了。观察者类似于委托的处理方式。//IObservable.h#pragma
阅读全文
摘要:15.1.解释概念:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。main(),客户CCorpNode,抽象基类,实现基本信息CBranchNode,树枝节点,实现Addordinate()函数和GetSubordinate()函数CLeafNode,叶子节点,IsLeaf属性总是“true”说明:组合模式主要是实现在CBranchNode对象里增加对其它对象的数组,如vector<CCorpNode*>,数组里可以存放CBranchNode和CLeafNode对象。这样方便进行遍历操作。注意:组合模式有透明组合模式
阅读全文
摘要:14.1.解释概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。main(),客户IProject,产品接口CProject,产品类IIterator,迭代器接口IProjectIterator,产品迭代器接口CProjectIterator,产品迭代器实现类说明:CProject实现产品类,能够返回一个迭代器的指针。这个迭代器将封装产品类里的一个数组。所以迭代器在运行Next函数时,可以遍历这个数组的所有元素。简单来说,就是用代码实现vector<int>::iterator或vector<int>::const_iterator。我们来
阅读全文
摘要:装饰模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。13.1.解释main(),老爸ISchoolReport,成绩单接口CFourthGradeSchoolReport,四年级成绩单ReportDecorator,成绩单装饰器基类HighScoreDecorator,最高分装饰器SortDecorator,班级排名装饰器说明:对“四年级成绩单”进行装饰,ReportDecorator必然有一个private变量指向ISchoolReport。注意:看代码:// Decorator.cpp//主程序#include "stdafx
阅读全文
摘要:命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。应该是一个比较简单的模式了。12.1.解释main(),客户CInvoker,命令接收者,如项目经理IGroup,执行者接口CRequirementGroup,实际执行者之一CPageGroup,实际执行者之二CCodePage,实际执行者之三ICommand,命令接口CAddRequirementCommand,Execute函数,将调用CRequirementGroup的多个命令。来组合执行用户发出的命令。CDeletePageCommand,同上... ... 其它
阅读全文
摘要:桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。实现分离的办法就是增加一个类,11.1.解释main(),客户IProduct,产品接口CHouse,房子CIPod,ipodCClothes,服装CNewCorp,桥梁类,MakeMoney()是桥梁方法CNewHouseCorp,只能生产房子,所以构造函数是CHouse*CShanZhaiCorp,什么赚钱就生产什么,所以构造函数是IProduct*说明:客户直接使用CNewHouseCorp和CShanZhaiCorp类,在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的Ma
阅读全文
摘要:建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数。详细的还是看代码吧。10.1.解释main(),客户CCarModel,产品模型CBenzModel,奔驰模型CBMWModel,宝马模型ICarBuilder,建造者接口CBenzBuilder,奔驰建造者CBMWBuilder,宝马建造者CDirector,导演说明:CCarModel实现模板方法,Builder负责开始建造产品。建造产品时,构建的顺序由Director或main决定。注意:建造者模式和抽象工厂非常类似。建造者更重视
阅读全文
摘要:模板模式也是相当简单的一种模式,而且是比较常用的。模板模式是定义一个操作中的算法 的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。cbf4life举 的例子是悍马车模型,更详细的例子说明可以参考原作者博客:cbf4life.cnblogs.com。这里只提出C++的设计和实现方法,以方便随用随 取。9.1.解释main(),客户CHummerModel,悍马模型CHummerH1Model,悍马模型型号1CHummerH2Model,悍马模型型号2说明:在CHummerModel声明Start、Engineboom、
阅读全文
摘要:抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。看代码:7.1.解释main(),女娲IHuman,产品接口CYellowHuman,抽象产品之一CYellowFemaleHuman,具体产品之一CYellowMaleHuman,具体产品之二CWhiteHuman,抽象产品之二CWhiteFemaleHuman,具体产品之三CWhiteMaleHuman,具体产品之四CBlackHuman,抽象产品之三CBlackFemaleHuman,具体产品之五CBlackMaleHuman,具体产品
阅读全文