设计模式学习(十一)————外观模式

外观模式:为子系统中的一组接口提供一个一致的界面,次模式定义了一个高层接口,这个接口使得这一子系统更加容易使用!

其完美的体现了依赖倒转原则和迪米特法则的思想!

比如说举一个买卖股票的例子。

#define use_sharedPtr

#ifndef FUND
#define FUND
#include <QString>
#include <QtDebug>

class Stock1
{
public:
    void buy(){qDebug()<<"买入股票1";}
    void sell(){qDebug()<<"卖出股票1";}
};
class Stock2
{
public:
    void buy(){qDebug()<<"买入股票2";}
    void sell(){qDebug()<<"卖出股票2";}
};
class Stock3
{
public:
    void buy(){qDebug()<<"买入股票3";}
    void sell(){qDebug()<<"卖出股票3";}
};
//一般需要自己写析构函数的类,都需要实现复制构造函数和赋值运算符重载,以便能够完成深拷贝
class Fund
{
public:
    Fund()
    {
#ifdef use_sharedPtr
        _stock1 = QSharedPointer<Stock1>(new Stock1());
        _stock2 = QSharedPointer<Stock2>(new Stock2());
        _stock3 = QSharedPointer<Stock3>(new Stock3());
#else
        _stock1 = new Stock1();
        _stock2 = new Stock2();
        _stock3 = new Stock3();
#endif
    }
#ifndef use_sharedPtr
    Fund(const Fund & f)   //一般类里面有指针,且析构函数销毁了,则需要完成复制构造函数来深拷贝!!
    {
        _stock1 = new Stock1(*f._stock1);
        _stock2 = new Stock2(*f._stock2);
        _stock3 = new Stock3(*f._stock3);
    }
    Fund& operator=(const Fund& a)
    {
        if(this == &a)    //判断相等的情况!!
            return *this;
        if(_stock1 != NULL)
            delete _stock1;
        if(_stock2 != NULL)
            delete _stock2;
        if(_stock3 != NULL)
            delete _stock3;
        _stock1 = new Stock1(*a._stock1);
        _stock2 = new Stock2(*a._stock2);
        _stock3 = new Stock3(*a._stock3);
        return *this;
    }
    ~Fund()
    {
        delete _stock1;
        _stock1 = NULL;
        delete _stock2;
        _stock2 = NULL;
        delete _stock3;
        _stock3 = NULL;
    }
#endif
    void buy()
    {
        _stock1->buy();
        _stock2->buy();
        _stock3->buy();
    }
    void sell()
    {
        _stock1->sell();
        _stock2->sell();
        _stock3->sell();
    }
private:
#ifdef use_sharedPtr
    QSharedPointer<Stock1> _stock1;
    QSharedPointer<Stock2> _stock2;
    QSharedPointer<Stock3> _stock3;
#else
    Stock1 * _stock1;
    Stock2 * _stock2;
    Stock3 * _stock3;
#endif
};

#endif // FUND

#include "fund.h"

int main(int argc, char *argv[])
{
    Fund *fd = new Fund();
    Fund cd = *fd;   //调用复制构造函数
//    Fund cd;
//    cd = *fd;
    delete fd;
    fd=NULL;
    cd.buy();
    cd.sell();
    return 0;
}

这里买卖股票的行为可以使用一个公共的类来管理所有的股票,这样就可以将买卖股票提供一个简单的接口,降低了耦合度,又化简了操作,真是一举两得啊!

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/buyFund_facade_patterns_12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值