设计模式--结构型模式

1、原型模式

#include <iostream>
#include <string>

using namespace std;

//原型模式---->处理拷贝问题,在内部加入克隆函数
class Person
{
public:
    virtual void show() = 0;
    virtual Person *clon() = 0;
};

class Woker:public Person
{
public:
    Woker(int id = 1,string name = "小白")
    {
        this->name = name;
        this->id = id;
    }
    void show()
    {
        cout<<"id = "<<id<<",name = "<<name<<endl;
    }
    Person *clon()//浅克隆
    {
        Woker *w = new Woker;
        *w = *this;
        return w;
    }
private:
    int id;
    string name;
};

void func(Person *p)
{
    Person *w = p;
    w->clon();
    w->show();
}


int main()
{
    Woker w1;

    func(&w1);

    return 0;
}

2、代理模式

#include <iostream>

using namespace std;


//代理模式
class Person
{
public:
    virtual void find_home() = 0;
    virtual void sign()      = 0;
    virtual void pay()       = 0;
    virtual void live()      = 0;
};

class Myself:public Person
{
public:
    virtual void find_home()
    {
        cout<<"自己找房子"<<endl;
    }
    virtual void sign()
    {
        cout<<"自己签合同"<<endl;
    }
    virtual void pay()
    {
        cout<<"自己付钱"<<endl;
    }
    virtual void live()
    {
        cout<<"自己住"<<endl;
    }
};

class Proxy:public Person
{
public:
    Proxy(Person *m)
    {
        this->m = m;
    }
    virtual void find_home()
    {
        cout<<"中介找房子"<<endl;
    }
    virtual void sign()
    {
        cout<<"中介签合同"<<endl;
    }
    virtual void pay()
    {
        m->pay();
    }
    virtual void live()
    {
        m->live();
    }
private:
    Person *m;
};

int main()
{
    Person *m = new Myself;
    m->find_home();
    m->sign();
    m->pay();
    m->live();

    cout<<"-----------------------------------"<<endl;
    Person *p = new Proxy(m);
    p->find_home();
    p->sign();
    p->pay();
    p->live();


    return 0;
}

3、装饰模式

#include <iostream>

using namespace std;

//装饰模式
class Bicycle
{
public:
    virtual void show() = 0;
};
//基础车
class Runbicycle:public Bicycle
{
public:
    void show()
    {
        cout<<"老司机的小自行车"<<endl;
    }
};

//模块
class Decorator:public Bicycle
{
public:
    virtual void add() = 0;
protected:
    Bicycle *b;
};
//模块实现
class fly:public Decorator
{
public:
    fly(Bicycle *b)
    {
        this->b = b;
    }

    void show()
    {
        b->show();
        add();
    }

    void add()
    {
        cout<<"安装飞行装置"<<endl;
    }

};
class swim:public Decorator
{
public:
    swim(Bicycle *b)
    {
        this->b = b;
    }

    void show()
    {
        b->show();
        add();
    }

    void add()
    {
        cout<<"安装潜水装置"<<endl;
    }
};


int main3()
{
    Bicycle *b = new Runbicycle;
    b->show();

    cout<<"---------------"<<endl;
    Decorator *d1 = new fly(b);
    d1->show();

    cout<<"---------------"<<endl;
    Decorator *d2 = new swim(d1);
    d2->show();

    cout<<"---------------"<<endl;
    Decorator *d3 = new swim(b);
    d3->show();


    return 0;
}

4、适配器模式

#include <iostream>

using namespace std;

//适配器模式
class P5V
{
public:
    virtual void use() = 0;
};

class P220V
{
public:
    void use()
    {
        cout <<"使用220v电压"<<endl;
    }
};


class adapter:public P5V
{
public:
    adapter(P220V *p)
    {
        this->p = p;
    }
    void use()
    {
        p->use();
        cout<<"经过转换,将220V电压转换成5V电压,对外提供"<<endl;
    }
private:
    P220V *p;
};


int main()
{
    P220V *p = new P220V;
    P5V *use = new adapter(p);
    use->use();


    return 0;
}

5、桥接模式

#include <iostream>

using namespace std;

class Colour
{
public:
    virtual void full() = 0;
};
class Red:public Colour
{
public:
    void full()
    {
        cout<<"填充红色"<<endl;
    }
};
class Bule:public Colour
{
public:
    void full()
    {
        cout<<"填充蓝色"<<endl;
    }
};
class Black:public Colour
{
public:
    void full()
    {
        cout<<"填充黑色"<<endl;
    }
};
class white:public Colour
{
public:
    void full()
    {
        cout<<"填充白色"<<endl;
    }
};

//图形
class Graph
{
public:
    void setcolour(Colour *c = nullptr)
    {
        this->c = c;
    }
    virtual void show() = 0;
protected:
    Colour *c;
};
class Triangle:public Graph
{
    void show()
    {
        cout<<"画了一个三角形"<<endl;
        if(c != nullptr)
            c->full();
    }
};
class Ellipse:public Graph
{
    void show()
    {
        cout<<"画了一个椭圆"<<endl;
        if(c != nullptr)
            c->full();
    }
};

int main()
{
    Colour *c1 = new Red;
    Colour *c2 = new Bule;
    Colour *c3 = new Black;

    Graph *t = new Triangle;
    Graph *e = new Ellipse;

    //椭圆
    e->setcolour();
    e->show();
    e->setcolour(c1);
    e->show();
    e->setcolour(c2);
    e->show();
    e->setcolour(c3);
    e->show();

    //三角形
    t->setcolour(c1);
    t->show();
    t->setcolour(c2);
    t->show();
    t->setcolour(c3);
    t->show();

    return 0;
}

6、组合模式

#include <iostream>
#include <string>
#include <list>

using namespace std;

//组合模式
//文件(目录,普通文件)基类
class IFile
{
public:
    virtual ~IFile()
    {

    }
    virtual void Show() = 0;
    virtual void Add(IFile *) = 0;
    virtual void Delet(IFile *) = 0;
    virtual list<IFile *> *GetRoute() = 0;
    virtual string getname() = 0;
protected:
    string name;
};
//普通文件
class File:public IFile
{
public:
    File(string name)
    {
        this->name = name;
    }

    virtual void Show()
    {
        cout<<name<<endl;
    }
    virtual void Add(IFile *file)
    {
        return;
    }
    virtual void Delet(IFile *file)
    {
        return;
    }
    virtual list<IFile *> *GetRoute()
    {
        return nullptr;
    }
    string getname()
    {
        return name;
    }
};
//目录文件
class Catalog:public IFile
{
public:
    Catalog(string name)
    {
        l = new list<IFile *>;
        this->name = name;
    }
    ~Catalog()
    {
        if(l != nullptr)
        {
            while(!l->empty())
            {
                delete *(l->begin());
                l->erase(l->begin());
            }
            delete l;
            l = nullptr;
        }
    }
    virtual void Show()
    {
        cout<<name<<endl;
    }
    virtual void Add(IFile *file)
    {
        l->push_back(file);
    }
    virtual void Delet(IFile *file)
    {
        l->remove(file);
    }
    virtual list<IFile *> *GetRoute()
    {
        return l;
    }
    string getname()
    {
        return name;
    }
private:
    list<IFile *> *l;
};
/*
    D盘
        电影
            大黄蜂.mp4
            死侍.mp4
            新喜剧之王.mp4
            哈利波特
                哈利波特1.mp4
                哈利波特3.mp4
                哈利波特7.mp4
        学习
            面试宝典.paf
            剑指offer.pdf
        游戏
            仙剑奇侠传
                仙剑奇侠传1.exe
                仙剑奇侠传2.exe
                仙剑奇侠传3.exe
            魂斗罗.exe
            超级玛丽.exe
*/


bool compare(IFile *left,IFile *right)
{
    return (left->getname() < right->getname());
}

void func(IFile *f)
{
    IFile *study = new Catalog("学习");
    IFile *game = new Catalog("游戏");
    IFile *film = new Catalog("电影");
    IFile *d4 = new Catalog("哈利波特");
    IFile *g1 = new Catalog("仙剑奇侠传");


    IFile *d1 = new File("大黄蜂.mp4");
    IFile *d2 = new File("死侍.mp4");
    IFile *d3 = new File("新喜剧之王.mp4");
    IFile *d41 = new File("哈利波特1.mp4");
    IFile *d42 = new File("哈利波特3.mp4");
    IFile *d43 = new File("哈利波特7.mp4");

    IFile *s1 = new File("面试宝典.paf");
    IFile *s2 = new File("剑指offer.pdf");

    IFile *g11 = new File("仙剑奇侠传1.exe");
    IFile *g12 = new File("仙剑奇侠传2.exe");
    IFile *g13 = new File("仙剑奇侠传3.exe");
    IFile *g2 = new File("魂斗罗.exe");
    IFile *g3 = new File("超级玛丽.exe");

    f->Add(film);
    f->Add(study);
    f->Add(game);

    film->Add(d1);
    film->Add(d2);
    film->Add(d3);
    film->Add(d4);
    d4->Add(d41);
    d4->Add(d42);
    d4->Add(d43);

    study->Add(s1);
    study->Add(s2);

    game->Add(g1);
    g1->Add(g11);
    g1->Add(g12);
    g1->Add(g13);
    game->Add(g2);
    game->Add(g3);

}

void show(IFile *f,int count)
{
    for(int i = 0;i < count;i++)
        cout<<"....";

    f->Show();

    list<IFile *> *mlist = f->GetRoute();
    if(mlist != nullptr)
    {
        mlist->sort(compare); //从 小到大排序
        list<IFile *>::iterator it = mlist->begin();
        while(it != mlist->end())
        {
            show(*it,count+1);
            it++;
        }
    }


}

int main()
{
    IFile *f = new Catalog("D盘");

    func(f);


    show(f,0);

    return 0;
}

7、观察者模式

#include <iostream>
#include <string>
#include <list>

using namespace std;

class Observer;
//通知者
class Obsecretary
{
public:
    virtual void add(Observer *) = 0;
    virtual void rm(Observer*) = 0;
    virtual void notify(string info) = 0;
};

//观察者
class Observer
{
public:
    virtual void reg(Obsecretary *) = 0;
    virtual void cancel(Obsecretary *) = 0;
    virtual void updata(string info) = 0;
};

class PlayGame:public Observer
{
public:
    virtual void reg(Obsecretary *o)
    {
        o->add(this);
    }

    virtual void cancel(Obsecretary *o)
    {
        o->rm(this);
    }

    virtual void updata(string info)
    {
        if(info == "老板来了")
            cout<<"关掉游戏"<<endl;
        else if(info == "老板走了")
            cout<<"打开游戏"<<endl;
    }
};
class WitchTV:public Observer
{
public:
    virtual void reg(Obsecretary *o)
    {
        o->add(this);
    }

    virtual void cancel(Obsecretary *o)
    {
        o->rm(this);
    }

    virtual void updata(string info)
    {
        if(info == "老板来了")
            cout<<"关掉电视"<<endl;
        else if(info == "老板走了")
            cout<<"打开电视"<<endl;
    }
};
class Secretary:public Obsecretary
{
public:
    virtual void add(Observer *o)
    {
        l.push_back(o);
    }
    virtual void rm(Observer* o)
    {
        l.remove(o);
    }
    virtual void notify(string info)
    {
        for(list<Observer *>::iterator it = l.begin();it != l.end();it++)
        {
            (*it)->updata(info);
        }
    }
private:
    list<Observer *> l;
};


int main()
{
    Observer *p1 = new PlayGame;
    Observer *p2 = new WitchTV;
    Obsecretary *p = new Secretary;

    p1->reg(p);
    p2->reg(p);
    cout<<"老板来了--------------"<<endl;
    p->notify("老板来了");

    cout<<"老板走了--------------"<<endl;
    p->notify("老板走了");


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值