文中图并不是真正意义上的类图,里面添加了部分方法的实现,便于理解该模式的程序的实现方式

创建型模式:

1.    工厂模式(Factory):

     Factory根据传入的参数condition生成具体的对象Operation对象。添加新产品Operation时并不影响以前系统代码

  

Operation* obj=Factory::CreateObject('+');

Obj->GetResult();

2.单例模式:(提供全局访问)

     

Singleton时添加:Singleton::_instance=0;     

全局调用:Singleton::Instance()->.............

3.建造者模式(Builder)

    当对象Product的创建比较复杂分多个部分,想实现对象的创建与对象的使用分开时,创建具体的的建造对象Builder来实现创建过程,具体创建由Direct来控制创建返回具体对象。

   

Direct*  p=new Direct();

Builder* b1=new ConcreteBuilder1();

Builder* b2=new ConcreteBuilder2();

p->Construct(b1);

p->Construct(b2);

Product* pb1=b1->GetResult();

Product* pb2=b2->GetResult();

pb1->show();

pb2->show();

4.抽象工厂模式(abstactFactory):(创建一组相互依赖的对象)

     创建组策略由AbstractFactory子类对象来实现,相互依赖对象ProductA1ProductB1

  和ProductA2ProductB2

 

AbstractFactory*  cf1=new  AbstractFactoryA();

Cf1->createProductA1();

Cf1->createProductB1();

AbstractFactory*  cf2=new  AbstractFactoryB();

Cf2->createProductA2();

Cf2->createProductB2();

4.原型模式(prototype:自身复制自己创造新类

  Prototype通过调用自身方法Clone()复制个新的自己实例p1

  

    Prototype* p=new ConcretePrototype();

    Prototype* p1=p->Clone();

构造型模式:

1.组合模式(composite)(构建递归结构)

         TComponent中的Vector存储子类Leaf,通过Operation()方法遍历实现子类的方法,从而达到组合对象和单个对象的统一使用。(管理类需要提供对子类的管理策略类(add,remove,select等方法))

   

  Leaf* l=new Leaf();

  l->Operation();

  TComponent* com=new TComposite();

  Com->Add(l);

  Com->Operation();

  Component* ll=com->GetChild(0);

  ll->Operation();

2.外观模式(facade)

     为一组接口Subsystem1Subsystem2接口提供一致性界面Facade,用户在Facade中只用添加相应接口即可使用

    

       Facade* f=new Facade();

       f->OperationWrapper();

3.装饰模式(decorator)(解决继承的深度较深,系统变复杂的问题)

ConcreteComponent类添加新的职责时,通过Decorator类的子类ConcreteDecorator来添加新的功能AddedBehaviorDecoratorConcreteComponent拥有共同的父类,Decorator

可以承担Compent的所有子类添加功能的作用。

    

   Component* com=new ConcreteComponent();

   Decorator*  dec=new ConcreteDecorator(com);

   dec->Operation();

4.适配器模式(adapter):(保持服务一致性

    当对象productD提供了对象Product类系列相同的功能play,但不属于Product类时,创建适配器对象ProductC,ProductC方法play()中使用对象ProductD来实现play功能。

ProductD*  po=new ProductD();

Product*    pa=new ProductC(po);

Pa->play();

5.享元模式(Flyweight):

     将类Flyweight的子类,放入FlyweightFactory的数组列表中(这里使用的是GetFlyweight方法),使用者通过GetFlyweight()方法调用所需要的子类,实现共享。

FlyweightFactory* fc=new FlyweightFactory();

Flyweight*  fw1=fc->GetFlyweight("hello");(这里类表中有则返回对象,没有则插入并返回)

Flyweight*  fw2=fc->GetFlyweight("world");

Flyweight*  fw3=fc->GetFlyweight("hello");

6.代理模式(proxy):(解决创建开销大的对象问题,创建一个代价较小对象去处理)

  

  通过对象Proxy的方法Request去调用ConcreteSubject对象的Request方法,实现了

逻辑和实现的解耦。

  

  Subject* sub= new ConcreteSubject();

  Proxy*  p=  new Proxy(sub);

  p->Request();

7.桥接模式(bridge):(分离抽象与实现,与代理模式差不多)

   新的算法AbstractionImp的增加并不影响他的实现Abstraction

        

AbstractionImp* imp=new ConcreteAbstractionImpA();

Abstraction* abs=new RefinedAbstraction(imp);

abs->Operation();

行为型模式:

1.状态模式:(分离状态逻辑和动作实现部分)

   当事物在不同的状态下有不同的表现ConcreteStateAConcreteStateB,当状态需要改变时,

当前状态对象OpChangStateA创建改变后的状态B传入父类的ChangState方法,通过调用StateChangeState方法来改变Context类中当前状态对象

State*  st=new ConcreteStateA();

Context* con=new Context(st);

Con->OpChangState(.....);

Con->_state->play();

2.观察者模式(observer)

     创建观察者ConcreteObserverAConcreteObserverB,观察者被注册Arrach到观察对象的通知列表_obvs中,当对象Subject发生改变时,Suject通过Notify依次通知列表中的观察者,观察者更新Update获得最新的属性。

       

    ConcreteSubject* sub=new ConcreteSubject();

Observer* p1=new ConcreteObserverA(sub);

Observer* p2=new ConcreteObserverB(sub);

sub->SetState("old");

sub->Notify();

sub->SetState("new");

sub->Notify();   

3.策略模式(strategy)

策略类的增添修改并不影响,并不影响使用的实体类Content。策略类实体作为参数传入使用的实体类来使用。

Strategy_Object*  _op=new StrategyA();

Content*     pc=new  Content(_op);

Pc->DoAction();

4.模板模式(Template):(封装算法逻辑)

           当应用算法是相同的,可以用AbstractClass提供统一的实现Operation1(),

具体的实现在其子类ConcreteClassAConcreteClassB中实现。

AbstractClass* p1=new ConcreteClassA();

AbstractClass* p2=new ConcreteClassB();

P1->TemplateMethos();

P2->TemplateMethod();

 

   5.命令模式(command):

      将请求封装在Command中,传入处理对象Action,Command传入PersonCommand的队列中,调用PersonRun()将执行命令行为。

  Action*  rec=new Action();

  Command*  cmdA=new  CommandA(rec);

  Command*  cmdB=new  CommandB(rec);

  Person*  pe=new  Person();

  pe->AddCmd(cmdA);

  pe->AddCmd(cmdB);

  Pe->Run();

6.访问者模式(visitor):(分离数据结构和访问者)

 增加新的操作时添加新的Visitor子类即可,访问对象Element只需在执行响应操作时在Accept()中传入响应访问者实例,在该方法中实现访问者得方法即可。

      

Visitor* vis=new ConcreteVistorA();

Element* elm=new ConcreteElementA();

Elm->Accept(vis);

  7.备忘录模式(memento):(捕获并保存一个类的状态,可以恢复保存的状态)

   Originator将对象状态通过CreateMemento()保存在Memento中,当调用RestoreToMemento()方法从Memento中取回刚才保存的状态

     

  Originator* or=new Originator();

  or->SetState("old");

  or->PrintState();

  Memento* mo=or->CreateMemento();

  or->SetState("new");

  or->PrintState();

  or->RestoreToMemento(mo);

  or->PrintState();

   8.中介者模式(mediator):(处理对象之间交互和通信)

       对象ColleageAColleageB通信交互时通过ConcreteMediator提供的方法来实现,交互对象不用维护对各自的引用,甚至可以不知道对方的存在,两者只需保存一个Mediator即可实现通信。Mediator保存着通信双方对象,DoActionFromAtoB()等来实现对象交互过程。

     

    ConcreteMediator* m=new ConcreteMediator();

ConcreteColleageA* c1=new ConcreteColleageA(m);

ConcreteColleageB* c2=new ConcreteColleageB(m);

m->Init(c1,c2); //获取两者实例

c1->Action();

c2->Action();

    

9.迭代器模式(Iterator):解决遍历问题

   

      保存在_objs[]数组的对象对外提供GetItem()接口供调用。

Aggregate* ag=new ConcreteAggregate();

Iterator* it=new ConcreteIterator(ag);

 for (;!(it->IsDone());it->Next())

  {

    cout<<it->CurrentItem()<<endl;

  }

   10.解释器模式(Interpreter):(未觉得有什么重要用处)

         Info为附加信息,AbstractExpressionAAbstractExpressionB为两种表达式的解

        释方式

       

    Info* c=new Context();

AbstractExpression* te=new AbstractExpressionA("hello");

AbstractExpression* nte=new AbstractExpressionB(te,2);

nte->Interpret(*c);

      

11.责任链模式(chain of responsibility):将处理请求对象练成一个链,请求在链上传

                                    递,直到被处理

    ConcreteHandleA对象当请求HandleRequest到来时,先通过Getsuccessor()查看

自己有没有后继,如果有则交给后继处理ConcreteHandleB,没有则自己处理。

Handle* h1=new ConcreteHandleA();

Handle* h2=new ConcreteHandleB();

h1->SetSuccessor(h2);

h1->HandleRequest();

   面向对象设计原则:优先使用对象组合,少用继承

   继承:易于修改、扩展复用,但父类改变则子类必须改变(白盒复用)

   组合:组合对象和被组合对象之间依赖小,隐藏被组合对象内部细节(黑盒复用)

posted on 2011-07-20 10:24  musketeer  阅读(253)  评论(0编辑  收藏  举报