浅谈C++ 设计模式的基本原则

先上银行类案例代码如下:

#include<iostream>
using namespace std;
class BankWorker
{
public:
    void save()
    {
        cout << "存款" << endl;
    }
    void moveM()
    {
        cout << "取款" << endl; 

    }
    void jiaofei()
    {
        cout << "缴费" << endl;
    } 

};
class AbBankWorker
{
public:
    virtual void dothing() = 0;
}; 

class SaveBanker :public AbBankWorker
{
public:
    virtual  void dothing()
    {
        cout << "存款" << endl;
    }
};
class MoveBanker :public AbBankWorker
{
public:
    virtual  void dothing()
    {
        cout << "取款" << endl;
    }
};
class SaveBanker :public AbBankWorker
{
public:
    virtual  void dothing()
    {
        cout << "缴费款" << endl;
    }
};
void main11()
{
    BankWorker*bw = new BankWorker;
    bw->jiaofei();
    bw->moveM();
    bw->save();
    cout << "hello..." << endl;
    system("pause");
    return; 

}
void main22()
{
    AbBankWorker*bw = NULL;
        bw=new MoveBanker;
        bw->dothing();
        delete bw;
    return; 

}
void main()
{ 

    main22(); 

    system("pause");
    return;
}

单一职责原则类的职责要单一,对外只提供一种功能,而引起内变化的原因都应该只有一个,就是依赖倒置原则依赖于抽象接口,不要依赖具体的实现类,也就是针对接口编程

#include<iostream>
using namespace std;
class HardDisk
{public:
    virtual void work();
}; 

class Memory
{
public:
    virtual void work();
};
class Cpu
{
public:
    virtual void work();
};
class ComPuter
{
public:
    ComPuter(HardDisk*m_handdisk, Memory*m_memory, Cpu*m_cpu)
    {
        m_handdisk = handdisk;
        m_memory = memory;
        m_cpu = cpu;
    }
public:
    void work()
    {
        m_handdisk->work();
        m_memory->work();
        m_cpu->work();
    }
private:
    HardDisk*m_handdisk;
        Memory*m_memory;
        Cpu*m_cpu;
}; 

class InterCpu :public Cpu
{
public:
    void work()
    {
        cout << "我是因特尔厂家" << endl;
    }
};
class XSDisk :public HardDisk
{
public:
    void work()
    {
        cout << "我是西数硬盘厂家" << endl;
    }
};
class JSDMem :public Memory
{
public:
    void work()
    {
        cout << "我是JSDMem厂家" << endl;
    }
};
void main()
{
    HardDisk*handdisk=NULL;
    Memory*memory=NULL;
    Cpu*cpu=NULL;
    handdisk = new XSDisk;
    memory= new JSDMem;
    cpu = new InterCpu;
    ComPuter*mycomputer = new ComPuter(harddisk, memory, cpu);
    mycomputer->work();
    delete mycomputer;
    delete cpu;
    delete  memory;
    delete  harddisk;
    cout << "hello" << endl;
    system("pause");
    return;
}

接口隔离原则不应该强迫客户的程序依赖他们不需要的接口方法,一个接口应该是提供一种对外功能,不应该把所有的操作都封装到一个接口中去

里氏替换原则任何抽象类出现的地方都可以用它的实现类进行替换,实际就是虚拟机智语言级别,实现面向对象功能

优先使用组合而不是继承原则如果使用继承,会导致复位的任何变化,都可能影响此类的行为,如果使用对象组合,就降低了这种依赖关系

迪米特法则一个对象应当对其他对象尽可能少的了解,从而降低各个对象之间的耦合,提高系统的可维护性。例如,在一个程序中,各个模块之间相互调用时,通常会提供一个统一的接口来实现,这样其他模块不需要了解另外一个模块的内部实现细节,这样当一个模块内部的实现发生改变的时候,不会影响其他模块的使用黑盒原理。

到此这篇关于浅谈C++ 设计模式的基本原则的文章就介绍到这了,更多相关C++ 设计模式的基本原则内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++设计模式迪米特法则实例

    迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话.英文简写为: LoD. 类的设计接口尽量封装完善,让外部直接调用 #include<iostream> #include<string> #include<vector> using namespace std; class AbstractBuilding { public: vi

  • C++设计模式之Proxy模式(代理模式)详解

    代理模式很容易理解,就是代替别人去做某一件事,打个比方,我们需要买水果,一般是去超市或者水果店买水果,很少有人去果园买水果,果园是生产水果的地方,但很少出售水果,在这里,水果店,超市就成了代理. 首先定义一个抽象类,提供所有的函数接口. 1.定义卖水果的抽象类,也就是接口,果园与超市都要继承这个类. #pragma once class CSellFruits//定义一个抽象类 { public: CSellFruits(void); virtual ~CSellFruits(void); vi

  • C++设计模式之Static Factory模式详解

    简单工厂模式并不是GOF提出的23种设计模式中的一种.工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品. 适用场合 1.在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式: 2.由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护. 1.定义抽象类,也就是接口 class Product { public: virtual void sh

  • C++设计模式之桥接模式(Bridge)

    桥接模式属于先天模式,这里的先天模式就是说一开始就要把结构搭建好,方便后来的扩展,而不是对已经出现的模块和接口进行改进扩展的.桥接的核心在于实体类和操作类之间的聚合关系,这个聚合关系就是我们所说的"桥",不同于装饰.代理和适配器模式的中的聚合关系,桥接不存在两者之间的继承关系,操作类是完全解耦的,而实体类对于操作类也只是弱耦合. 作用 将抽象部份与它的实现部份分离,使它们都可以独立地变化. 类视图 实现 //操作类 class action { public: virtual void

  • C++设计模式之适配器模式(Adapter)

    适配器模式顾名思义在于接口的转换,最形象的例子就如两口转三口电源适配器,口子的数量可以理解为参数数量,一如我们调用三个参数的接口,而提供的接口只有两个参数,那么久需要适配器类进行接口的扩展改造,这就是适配器模式存在的最主要意义. 作用 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 想使用一个已经存在的类,但如果它的接

  • C++设计模式之装饰模式(Decorator)

    装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用 装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类就能扩展对象的新功能,提供了比继承更有弹性的替代方案,避免了子类数量膨胀带来的系统臃肿. 类视图 代码实现 class Component { public: Component(){} virtual ~Component(){} virtual void operation() = 0; };

  • C++设计模式之建造者模式(Builder)

    建造者模式与工厂模式最大的区别在与建造者模式更注重的是创建的一系列过程,如流水化作业,工厂模式强调的是区分不同的工厂和产品,而建造者模式更注重的统一不同产品在流水线上的工序,达到统一作业. 作用 建造者模式是将一个复杂对象和他的构造和组装过程分离,这样再重复创建不同对象时使用相同的流程进行建造.对于调用者来说,只需要知道产品的类型,而不需要知道具体的组装过程. 类视图 代码实现 class Builder { public: virtual void SelectCpu()= 0; virtua

  • C++设计模式之工厂方法模式的实现及优缺点

    工厂方法模式是在简单工厂模式的缺点上进行优化的,我们都知道,在简单工厂模式中,要去增加或者减少一个产品的类型,都需要修改工厂中的if-else判断.这样子显然不符合我们代码开发中的开闭原则,拓展起来也是非常麻烦的 工厂方法模式 = 简单工厂模式 + "开闭原则" 定义思想:工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的就是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类 优点: 不需要记住具体的类名,

  • C++设计模式之代理模式(Proxy)

    代理模式是一种程序设计最为重要的一种模式,其具体的使用非常广泛,根据它的作用,其实我们可以直接理解为中间件或者中间层,比如各类软件的中间件,软件与硬件中的中间层. 作用 为其他对象提供一种代理以控制对这个对象的访问.这样实现了业务和核心功能分离. 抽象类视图 分类 虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,使其只有在真正需要时才被创建. 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实.这个不同的地址空间可以是

  • C++设计模式之简单工厂模式的实现示例

    前言 在我们要使用一个对象时,就必须通过类来实例化对象,也就是需要new一个对象.在new的过程是非常复杂的,要经过读文件->解析文本->创建对象->给属性设值等过程.而引入工厂模式,就是将创建类的这个步骤又工厂来帮我们完成,我们只需要去使用工厂里创建好的类即可.在使用工厂时,我们需要让工厂知道我们想要的一个对象,所以我们可以通过传参的方式去告诉工厂我们的需求 定义思想:在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通

  • C++设计模式之备忘录模式(Memento)

    当我们在实际应用中需要提供撤销机制,当一个对象可能需要再后续操作中恢复其内部状态时,就需要使用备忘录模式.其本质就是对象的序列化和反序列化的过程,支持回滚操作. 作用 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先的状态. 类视图 实现 typedef struct sysstate; //假设的一个空结构,用来代表系统状态 //还原点 class Memento { public: Memento(sysstate &statein

随机推荐