打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
结构型设计模式
一:代理模式
​前言:
​代理模式实现:https://blog.csdn.net/carson_ho/article/details/54910472
 如图;经纪人就是明星的代理,当客户需要找明星派电影时,首先需要找到经纪人,经纪人代理明星进行全权的谈判。
​伪代码表示上图:

​代理模式的执行过程

​当用户调用代理对象时,首先由代理对象完成部分工作后,再调用委托对象的方法。

(2)代理模式的实现
​      由于代理需要完全代理目标对象,因此代理就需要实现目标对象的所有接口。为简单起见,明星拍电影为需要实现的方法,经纪人代理明星和客户谈判为例。明星是委托人,经纪人是代理。
首先抽象出公共的接口
​//创建公共的接口类
class Interface
{
public:
    virtual void makingMovie()=0;  //定义一个拍电影的抽象接口
};
在明星类中实现公共接口,完成明星应该做的事
​//委托对象,明星类
class Star : public Interface
{
public:
    Star();
    void makingMovie(); //实现共同的接口
};

​//cpp文件
Star::Star()
{
}
void Star::makingMovie() //拍电影的方法
{
    qDebug()<<"making movie"; //拍电影的方法
}

在经纪人类中实现公共接口,完成明星工作前需要的准备工作,调用明星的函数
​//代理对象,经纪人类
class Broker : public Interface
{
private:
    Star *star;
public:
    Broker();
    void makingMovie(); //实现共同的接口
};

​//cpp文件
Broker::Broker()
{
    star=new Star();
}
void Broker::makingMovie() //实现共同的接口
{
    qDebug()<<"discuss cooperation"; //经纪人首先谈好和拍电影相关的事
    star->makingMovie();
}

在数函数中的使用
​#include <QCoreApplication>
#include "broker.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Broker *broker=new Broker(); //创建经纪人,即代理类
    broker->makingMovie();
    return a.exec();
}
​代理模式工程资料:https://pan.baidu.com/s/1Q6J4Y1zE0rJ0sXg31N8ahA

​二:策略模式
​参考:http://liuwangshu.cn/designpatterns/11-strategy.html
      将所有的解决方案提前设定好,不根据当前的情况做判断,将不同问题的不同的解决方案一一对应起来。例如:如果我们周一到周三上早班,闹钟应该定在7:00;周四、周五上晚班,闹钟定在10:00;那么定两个闹钟,周一到周三:7:00,周四、周五:10:00。将问题和方案进行映射处理,不需要每次去判断。
​三:装饰者模式
​参考:https://www.cnblogs.com/stonefeng/p/5679638.html
      一个面馆中面条作为主食,面条中可以添加牛肉、鸡蛋等两种配料,这两种配料客户可以自由选择是否添加,每种配料的价格都不一样。面条3元,牛肉5元,鸡蛋3元。
​实现方法:
​(1)定义被装饰者类(面条类,所有的方法必须都是虚的)
​//定义被装饰者面条类
class Noodles
{
public:
    Noodles()
    {
    }
    virtual ~Noodles() //抽象类的析构函数必须是虚函数
    {
    }
    virtual int getPrince() //得到价格
    {
        return 3; //面条是3元
    }
    virtual QString getDescription() //得到描述的内容
    {
        return "noodles"; //返回描述
    }
};
​(2)继承被装饰者类,并且重写被装饰者类的所有方法
​​实现牛肉这一装饰者
​//为面条加上牛肉的装饰者
class BeefNoodles : public Noodles
{
private:
    Noodles *m_Noodles; //定义被装饰者,指针可以指向任何一个装饰者
public:
    BeefNoodles(Noodles *noodles)
    {
        m_Noodles=noodles;
    }
    int getPrince() //得到对应的价格
    {
       return m_Noodles->getPrince()+5;  //牛肉面需要加5元
    }
    QString getDescription() //得到描述
    {
       return m_Noodles->getDescription()+",beef"; //加上牛肉的描述
    }
};


实现鸡蛋装饰者
​//为面条加上鸡蛋的装饰者
class EggNoodles : public Noodles
{
private:
    Noodles *m_Noodles; //定义被装饰者
public:
    EggNoodles(Noodles *noodles)
    {
        m_Noodles=noodles;
    }
    int getPrince() //得到对应的价格
    {
       return m_Noodles->getPrince()+3;  //鸡蛋需要3元
    }
    QString getDescription() //得到描述
    {
       return m_Noodles->getDescription()+",egg"; //加上鸡蛋的描述
    }
};

注意:装饰者类必须拥有被装饰者的对象
​(3)使用装饰者组合产品
​int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Noodles *noodles=new Noodles(); //基类指针可以指向任何一个装饰者
    qDebug()<<noodles->getDescription()<<":"<<noodles->getPrince(); //打印出产品信息
    noodles=new BeefNoodles(noodles);  //为面条添加牛乳装饰者
    qDebug()<<noodles->getDescription()<<":"<<noodles->getPrince();//打印出产品信息
    noodles=new EggNoodles(noodles);   //为面条添加鸡蛋装饰者
    qDebug()<<noodles->getDescription()<<":"<<noodles->getPrince();//打印出产品信息
    return a.exec();
}

输出信息:
 项目完整工程(基于Qt5.5):
https://pan.baidu.com/s/19jtQeMw3g-1UC_G7MPXx1A

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
面条和粉,你更喜欢哪个?
用英语介绍面条—Chinese Noodles
java设计模式-Head First设计模式之Decorator模式 - java学习
[Head First设计模式]山西面馆中的设计模式——装饰者模式
Java设计模式之装饰模式趣谈
Java设计模式之装饰者模式详解和代码实例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服