随笔分类 -  设计模式

摘要:在设计模式中,类与类之间的关系:依赖、关联、聚合、组合、继承。他们的耦合度依次增强。1、依赖(Dependence) 类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。2、关联(Association) 类A当中使用了类B,其中类B是作为类A的成员变量(单向关联),同时类B中也使用了类A作为成员变量(双向关联)。3、聚合(Aggregation) 聚合关系是关联关系的一种,关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的关系。4、组合(Composition) 组合是一种耦合度更强的关联关系... 阅读全文
posted @ 2013-09-01 16:44 Leung文
摘要:意图:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。class Visitor;class Element{public: Element() {} virtual ~Element() {} virtual void Accept(Visitor* visitor) = 0;};class Visitor{public: Visitor() {} virtual ~Visitor() {} virtual void VisitElementA(Element* elemen... 阅读全文
posted @ 2013-05-06 15:08 Leung文
摘要:意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。class Receiver{public: Receiver() {} virtual ~Receiver() {} virtual void Action() { cout<<"Receiver::Action()"<<endl; }};class Command{public: Command() {} virtual ~Command() {} virtual void Execut... 阅读全文
posted @ 2013-05-06 14:49 Leung文
摘要:意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。class Iterator{public: Iterator() {} virtual ~Iterator() {} virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() = 0; virtual string CurrentItem() = 0;};class Aggregate{public: Aggregate() {} virtual ~Aggre... 阅读全文
posted @ 2013-05-06 14:16 Leung文
摘要:意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。class Strategy{public: Strategy() {} virtual ~Strategy() {} virtual void AlgorithmInterface() = 0;};class ConcreteStrategyA: public Strategy{public: ConcreteStrategyA() {} ~ConcreteStrategyA() {} void AlgorithmInte... 阅读全文
posted @ 2013-05-06 11:38 Leung文
摘要:意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。class Context;class State{public: State() {} virtual ~State() {} virtual void Operation(Context* context) = 0;};class ConcreteStateA: public State{public: ConcreteStateA() {} ~ConcreteStateA() {} void Operation(Context* context);};... 阅读全文
posted @ 2013-05-06 11:27 Leung文
摘要:意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。class Subject;class Observer{public: Observer() {} virtual ~Observer() {} virtual void Update(Subject* subject) = 0;};class Subject{public: Subject():subject_state(0), observers() {} virtual ~Subject() {} int GetSt... 阅读全文
posted @ 2013-05-06 09:48 Leung文
摘要:意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。class Memento{friend class Originator;public: ~Memento() {}private: Memento(const string& state) { this->state = state; }private: string state;};class Originator{public: Originator() {} ~Originator() {... 阅读全文
posted @ 2013-05-05 23:40 Leung文
摘要:意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。class Mediator{public: Mediator() {} ~Mediator() {} virtual void Notify() = 0;};class Colleague{public: Colleague(Mediator* mediator) { thi... 阅读全文
posted @ 2013-05-05 23:32 Leung文
摘要:意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。class Handler{public: Handler() { successor = NULL; } virtual ~Handler() {} virtual void HandleRequest(int requestType) = 0; void SetSuccessor(Handler* successor) { this->successor = succ... 阅读全文
posted @ 2013-05-05 17:59 Leung文
摘要:意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。class AbstractClass{public: AbstractClass() {} virtual ~AbstractClass() {} virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; void TemplateMethod() { PrimitiveOperation1(); ... 阅读全文
posted @ 2013-05-05 17:46 Leung文
摘要:意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。class Context{public: Context() {} ~Context() {}};class AbstractExpression{public: AbstractExpression() {} virtual ~AbstractExpression() {} virtual void Interpret(Context* context) = 0;};class TerminalExpression: public Ab... 阅读全文
posted @ 2013-05-05 17:36 Leung文
摘要:意图:为其他对象提供一种代理以控制对这个对象的访问。class Subject{public: Subject() {} virtual ~Subject() {} virtual void Request() = 0;};class RealSubject: public Subject{public: RealSubject() {} ~RealSubject() {} void Request() { cout<<"RealSubject::Request()"<<endl; }};class Prox... 阅读全文
posted @ 2013-05-05 17:06 Leung文
摘要:意图:运用共享技术有效地支持大量细粒度的对象。class Flyweight{public: Flyweight() {} virtual ~Flyweight() {} virtual void Operation(int extrinsic_state) = 0;};class ConcreteFlyweight: public Flyweight{public: ConcreteFlyweight(const string& key) { this->key = key; } ~ConcreteFlyweight() ... 阅读全文
posted @ 2013-05-05 16:56 Leung文
摘要:意图:为子系统中的一组接口提供一个一致的界面,使得这一子系统更加容易使用。class SubSystemA{public: SubSystemA() {} ~SubSystemA() {} void Operation() { cout<<"SubSystemA::Operation()"<<endl; }};class SubSystemB{public: SubSystemB() {} ~SubSystemB() {} void Operation() { cout<<"SubSyst... 阅读全文
posted @ 2013-05-05 15:01 Leung文
摘要:意图:动态地给一个对象添加一些额外的职责。class Component{public: Component() {} virtual ~Component() {} virtual void Operation() = 0;};class ConcreteComponent: public Component{public: ConcreteComponent() {} ~ConcreteComponent() {} void Operation() { cout<<"ConcreteComponent::Ope... 阅读全文
posted @ 2013-05-05 14:41 Leung文
摘要:意图:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。class Component{public: Component() {} virtual ~Component() {} virtual void Add(Component* component) {} virtual void Operation() = 0;};class Composite: public Component{public: Composite() {} ~Composite() {} voi... 阅读全文
posted @ 2013-05-05 14:15 Leung文
摘要:意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。class Abstraction{public: Abstraction() {} virtual ~Abstraction() {} virtual void Operation() = 0;};class Implementor{public: Implementor() {} virtual ~Implementor() {} virtual void OperationImp() = 0;};class RefinedAbstraction: public Abst... 阅读全文
posted @ 2013-05-05 13:56 Leung文
摘要:意图:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。class Target{public: Target() {} virtual ~Target() {} virtual void Request() { cout<<"Target::Request()"<<endl; }};class Adaptee{public: Adaptee() {} ~Adaptee() {} void SpecificRequest() { cout... 阅读全文
posted @ 2013-05-04 22:00 Leung文
摘要:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。class Singleton{public: static Singleton* Instance() { if(_instance == NULL) { // ScopedLock lock; if(_instance == NULL) { _instance = new Singleton(); } } return _instance; }protected: ... 阅读全文
posted @ 2013-05-04 21:41 Leung文