设计模式(四)

8 篇文章 0 订阅
5 篇文章 0 订阅

迭代器模式

   GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。

为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口。

例:

#include <iostream>
#include <vector>
using namespace std;

template<class Item>
class Iterator
{
public:
    virtual void first()=0;
    virtual void next()=0;
    virtual Item* currentItem()=0;
    virtual bool isDone()=0;
    virtual ~Iterator(){}
};

template<class Item>
class ConcreteAggregate;

template<class Item>
class ConcreteIterator : public Iterator <Item>
{
    ConcreteAggregate<Item> * aggr;
    int cur;
public:
    ConcreteIterator(ConcreteAggregate<Item>*a):aggr(a),cur(0){}
    virtual void first()
    {
        cur=0;
    }
    virtual void next()
    {
        if(cur<aggr->getLen())
            cur++;
    }
    virtual Item* currentItem()
    {
        if(cur<aggr->getLen())
            return &(*aggr)[cur];
        else
            return NULL;
    }
    virtual bool isDone()
    {
        return (cur>=aggr->getLen());
    }
};

template<class Item>
class Aggregate
{
public:
    virtual Iterator<Item>* createIterator()=0;
    virtual ~Aggregate(){}
};

template<class Item>
class ConcreteAggregate:public Aggregate<Item>
{
    vector<Item >data;
public:
    ConcreteAggregate()
    {
        data.push_back(1);
        data.push_back(2);
        data.push_back(3);
    }
    virtual Iterator<Item>* createIterator()
    {
        return new ConcreteIterator<Item>(this);
    }
    Item& operator[](int index)
    {
        return data[index];
    }
    int getLen()
    {
        return data.size();
    }
};

int main()
{
    Aggregate<int> * aggr =new ConcreteAggregate<int>();
    Iterator<int> *it=aggr->createIterator();

    for(it->first();!it->isDone();it->next())
    {
        cout<<*(it->currentItem())<<endl;
    }
    delete it;
    delete aggr;
    return 0;
}

单例模式

   GOOD:保证一个类仅有一个实例,并提供一个访问它的全局访问点

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

 

class Singelton

{

private:

       Singelton(){}

       static Singelton* singel;

 

public:

       static Singelton* GetInstance()

       {

              if(singel == NULL)

              {

                     singel = new Singelton();

              }

              return singel;

       }

 

};

Singelton* Singelton::singel =NULL;//注意静态变量类外初始化

 

客户端:

int main()

{

       Singelton* s1=Singelton::GetInstance();

       Singelton* s2=Singelton::GetInstance();

       if(s1 == s2)

              cout<<"ok"<<endl;

       else

              cout<<"no"<<endl;

       return 0;

}


桥接模式

   GOOD:将抽象部分与实现部分分离,使它们可以独立变化。

   这里说的意思不是让抽象基类与具体类分离,而是现实系统可能有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出来让它们独立变化,减少它们之间的耦合性,即如果继承不能实现“开放-封闭原则”的话,就应该考虑用桥接模式。如下例:让“手机”既可以按品牌分类也可以

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

 

//手机软件

classHandsetSoft

{

public:

       virtual void Run()=0;

};

 

//游戏软件

classHandsetGame : public HandsetSoft

{

public:

       virtual void Run()

       {

              cout<<"运行手机游戏"<<endl;

       }

};

 

//通讯录软件

classHandSetAddressList : public HandsetSoft

{

public:

       virtual void Run()

       {

              cout<<"手机通讯录"<<endl;

       }

};

 

//手机品牌

classHandsetBrand

{

protected:

       HandsetSoft* m_soft;

public:

       void SetHandsetSoft(HandsetSoft* temp)

       {

              m_soft = temp;

       }

       virtual void Run()=0;

};

 

//M品牌

classHandsetBrandM : public HandsetBrand

{

public:

       virtual void Run()

       {

              m_soft->Run();

       }

};

 

//N品牌

classHandsetBrandN : public HandsetBrand

{

public:

       virtual void Run()

       {

              m_soft->Run();

       }

};

 

//客户端

int main()

{

       HandsetBrand *brand;

       brand = new HandsetBrandM();

       brand->SetHandsetSoft(newHandsetGame());

       brand->Run();

       brand->SetHandsetSoft(newHandSetAddressList());

       brand->Run();

 

       return 0;

}

命令模式

   GOOD:一、建立命令队列;二、可以将命令记入日志;三、接收请求的一方可以拒绝;四、添加一个新命令类不影响其它类;

命令模式把请求一个操作的对象与知道怎么操行一个操作的对象分开

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

 

//烤肉师傅

class Barbucer

{

public:

       void MakeMutton()

       {

              cout<<"烤羊肉"<<endl;

       }

       void MakeChickenWing()

       {

              cout<<"烤鸡翅膀"<<endl;

       }

};

 

//抽象命令类

class Command

{

protected:

       Barbucer* receiver;

public:

       Command(Barbucer* temp)

       {

              receiver = temp;

       }

       virtual void ExecuteCmd()=0;

};

 

//烤羊肉命令

classBakeMuttonCmd : public Command

{

public:

       BakeMuttonCmd(Barbucer* temp) :Command(temp){}

       virtual void ExecuteCmd()

       {

              receiver->MakeMutton();

       }

};

 

//烤鸡翅

classChickenWingCmd : public Command

{

public:

       ChickenWingCmd(Barbucer* temp) :Command(temp){}

 

       virtual void ExecuteCmd()

       {

              receiver->MakeChickenWing();

       }

};

 

//服务员类

class Waiter

{

protected:

       vector<Command*> m_commandList;

public:

       void SetCmd(Command* temp)

       {

              m_commandList.push_back(temp);

              cout<<"增加定单"<<endl;

       }

 

       //通知执行

       void Notify()

       {

              vector<Command*>::iteratorp=m_commandList.begin();

              while(p!=m_commandList.end())

              {

                     (*p)->ExecuteCmd();

                     p++;

              }

       }

};

 

//客户端

int main()

{

       //店里添加烤肉师傅、菜单、服务员等顾客

       Barbucer* barbucer=new Barbucer();

       Command* cmd= newBakeMuttonCmd(barbucer);

       Command* cmd2=newChickenWingCmd(barbucer);

       Waiter* girl = new Waiter();

    //点菜

       girl->SetCmd(cmd);

       girl->SetCmd(cmd2);

    //服务员通知

       girl->Notify();

       return 0;

}

责任链模式

   GOOD:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

//请求

class Request

{

public:

       string m_strContent;

       int m_nNumber;

};

//管理者

class Manager

{

protected:

       Manager* manager;

       string name;

public:

       Manager(string temp)

       {

              name = temp;

       }

       voidSetSuccessor(Manager* temp)

       {

              manager =temp;

       }

       virtual void GetRequest(Request* request)= 0;

};

//经理

classCommonManager : public Manager

{

public:

       CommonManager(string strTemp) :Manager(strTemp){}

       virtual voidGetRequest(Request* request)

       {

              if (request->m_nNumber>=0 && request->m_nNumber<10 )

              {

                     cout<<name<<"处理了"<<request->m_nNumber<<"个请求"<<endl;

              }

              else

              {

                     manager->GetRequest(request);

              }

       }

};

//总监

class MajorDomo: public Manager

{

public:

       MajorDomo(string name) : Manager(name){}

 

       virtual void GetRequest(Request* request)

       {

              if(request->m_nNumber>=10)

              {

                 cout<<name<<"处理了"<<request->m_nNumber<<"个请求"<<endl;

              }

       }

};

 

//客户端

int main()

{

       Manager * common = newCommonManager("张经理");

       Manager * major = new MajorDomo("李总监");

      

       common->SetSuccessor(major);

      

       Request* req = new Request();

       req->m_nNumber = 33;

       common->GetRequest(req);

      

       req->m_nNumber = 3;

       common->GetRequest(req);

       return 0;

}

中介者模式

   GOOD:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而降低耦合;而且可以独立地改变它们之间的交互。

例:

#include <iostream>

#include<string>

#include<vector>

using namespacestd;

 

class Colleague;

//中介者类

class Mediator

{

public:

       virtual void Send(stringmessage,Colleague* col) = 0;

};

//抽象同事类

class Colleague

{

protected:

       Mediator* mediator;

public:

       Colleague(Mediator* temp)

       {

              mediator = temp;

       }

};

//同事一

class Colleague1: public Colleague

{

public:

       Colleague1(Mediator* media) :Colleague(media){}

 

       void Send(string strMessage)

       {

              mediator->Send(strMessage,this);

       }

 

       void Notify(string strMessage)

       {

              cout<<"同事一获得了消息"<<strMessage<<endl;

       }

};

 

//同事二

class Colleague2: public Colleague

{

public:

       Colleague2(Mediator* media) :Colleague(media){}

 

       void Send(string strMessage)

       {

              mediator->Send(strMessage,this);

       }

 

       void Notify(string strMessage)

       {

              cout<<"同事二获得了消息"<<strMessage<<endl;

       }

};

 

//具体中介者类

classConcreteMediator : public Mediator

{

public:

       Colleague1 * col1;

       Colleague2 * col2;

       virtual void Send(stringmessage,Colleague* col)

       {

              if(col == col1)

                     col2->Notify(message);

              else

                     col1->Notify(message);

       }

};

 

//客户端:

int main()

{

       ConcreteMediator * m = newConcreteMediator();

 

       //让同事认识中介

       Colleague1* col1 = new Colleague1(m);

       Colleague2* col2 = new Colleague2(m);

 

       //让中介认识具体的同事类

       m->col1 = col1;

       m->col2 = col2;

 

       col1->Send("吃饭了吗?");

       col2->Send("还没吃,你请吗?");

       return 0;

}

享元模式

   GOOD:运用共享技术有效地支持大量细粒度的对象(对于C++来说就是共用一个内存块啦,对象指针指向同一个地方)。

     如果一个应用程序使用了大量的对象,而这些对象造成了很大的存储开销就应该考虑使用。

     还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用较少的共享对象取代多组对象,此时可以考虑使用享元。

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

 

//抽象的网站

class WebSite

{

public:

       virtual void Use()=0;

};

 

//具体的共享网站

classConcreteWebSite : public WebSite

{

private:

       string name;

public:

       ConcreteWebSite(string strName)

       {

              name = strName;

       }

       virtual void Use()

       {

              cout<<"网站分类:"<<name<<endl;

       }

};

 

//不共享的网站

classUnShareWebSite : public WebSite

{

private:

       string name;

public:

       UnShareWebSite(string strName)

       {

              name = strName;

       }

       virtual void Use()

       {

              cout<<"不共享的网站:"<<name<<endl;

       }

};

 

//网站工厂类,用于存放共享的WebSite对象

class WebFactory

{

private:

       vector<WebSite*>websites;

public:

       WebSite* GetWeb()

       {

              vector<WebSite*>::iteratorp = websites.begin();

              return *p;

       }

       WebFactory()

       {

              websites.push_back(newConcreteWebSite("测试"));

       }

};

 

//客户端

int main()

{

       WebFactory* f= new WebFactory();

       WebSite* ws= f->GetWeb();

       ws->Use();

 

       WebSite* ws2 = f->GetWeb();

       ws2->Use();

 

       //不共享的类

       WebSite* ws3 = new UnShareWebSite("测试");

       ws3->Use();

       return 0;

}

解释器模式

   GOOD:通常当一个语言需要解释执行,并且你可以将该语言中的句子表示成为一个抽象的语法树时,可以使用解释器模式。

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

 

class Context;

classAbstractExpression

{

public:

       virtual void Interpret(Context*context)=0;

};

 

class Expression: public AbstractExpression

{

public:

       virtual void Interpret(Context* context)

       {

              cout<<"终端解释器"<<endl;

       };

};

 

classNonterminalExpression : public AbstractExpression

{

public:

       virtual void Interpret(Context* context)

       {

              cout<<"非终端解释器"<<endl;

       }

};

 

class Context

{

public:

       string input;

       string output;

};

 

//客户端

int main()

{

       Context* context = new Context();

       vector<AbstractExpression*>express;

       express.push_back(new Expression());

       express.push_back(newNonterminalExpression());

       express.push_back(newNonterminalExpression());

 

       vector<AbstractExpression*>::iteratorp = express.begin();

       while (p!= express.end())

       {

              (*p)->Interpret(context);

              p++;

       }

       return 0;

}

访问者模式

   GOOD:适用于数据结构稳定的系统。它把数据结构和作用于数据结构上的操作分离开,使得操作集合

     优点:新增加操作很容易,因为增加新操作就相当于增加一个访问者,访问者模式将有关的行为集中到一个访问者对象中

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

 

class Man;

class Woman;

//行为

class Action

{

public:

       virtual void GetManConclusion(Man*concreteElementA)=0;

       virtual void GetWomanConclusion(Woman*concreteElementB)=0;

};

//成功

class Success :public Action

{

public:

       virtual void GetManConclusion(Man*concreteElementA)

       {

              cout<<"男人成功时,背后有个伟大的女人"<<endl;

       }

       virtual void GetWomanConclusion(Woman*concreteElementB)

       {

              cout<<"女人成功时,背后有个没用的男人"<<endl;

       }

};

 

//失败

class Failure :public Action

{

public:

       virtual void GetManConclusion(Man*concreteElementA)

       {

              cout<<"男人失败时,背后有个伟大的女人"<<endl;

       }

       virtual void GetWomanConclusion(Woman*concreteElementB)

       {

              cout<<"女人失败时,背后有个没用的男人"<<endl;

       }

};

 

//抽象人类

class Person

{

public:

       virtual void Accept(Action* visitor)=0;

};

 

//男人

class Man :public Person

{

public:

       virtual void Accept(Action* visitor)

       {

              visitor->GetManConclusion(this);

       }

};

 

//女人

class Woman :public Person

{

public:

       virtual void Accept(Action* visitor)

       {

              visitor->GetWomanConclusion(this);

       }

};

 

//对象结构类

class ObjectStructure

{

private:

       vector<Person*>m_personList;

 

public:

       void Add(Person*p)

       {

              m_personList.push_back(p);

       }

       voidDisplay(Action* a)

       {

              vector<Person*>::iteratorp = m_personList.begin();

              while (p!=m_personList.end())

              {

                     (*p)->Accept(a);

                     p++;

              }

       }

};

 

//客户端

int main()

{

       ObjectStructure * os= newObjectStructure();

       os->Add(new Man());

       os->Add(new Woman());

 

       Success* success = new Success();

       os->Display(success);

 

       Failure* fl = new Failure();

       os->Display(fl);

       return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较特别。第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非人组的标准名词),第13章介绍如何进一步学习设计模式,如何发觉新的设计模式等主题,至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了个OO基本概念(抽象、封装、继承、多态),而第1章到第9章也陆续介绍了九个OO原则(Principle)。千万不要轻视这些OO原则,因为每个设计模式背后都包含了几个OO原则的概念。很多时候,在设计时有两难的情况,这时候我们必须回归到OO原则,以方便判断取舍。可以这么说:OO原则是我们的目标,而设计模式是我们的做法。 --------------------- 作者:owen2335 来源:CSDN 原文:https://blog.csdn.net/owen2335/article/details/80444856 版权声明:本文为博主原创文章,转载请附上博文链接!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值