编程设计模式(C++)(1)

模式设计原则:扩展隔离变化点,抽象稳定点

大部分的设计模式都依赖于多态,要实现多态则需要用到虚函数;

虚函数分为一般虚函数和纯虚函数,一般虚函数调用是可以运行函数体中的代码的,纯虚函数的代码定义如下:

virtual void f()=0;

如下代码

#include<iostream>
using namespace std;
class A {
public:
    void print1() {
        cout << "A" << endl;;
    }
    virtual void print2() {
        cout << "A" << endl;
    }
};
class B :public A{
public:
    void print1() {
        cout << "B" << endl;
    }
    virtual void print2() {
        cout << "B" << endl;
    }
};
int main()
{
    A*p;
    A*test1= new A();
    B*test2 = new B();
    p = test1;
    p->print1();
    p->print2();
    p = test2;
    p->print1();
    p->print2();
    system("pause");
    return 0;
}
View Code

代码的输出结果如下

 很显然,当p指向testB指向的对象时调用print1()方法时,所执行的为类A的print1方法,因为指针p在声明时就将print1方法名和类A中的print1方法进行了静态绑定。

静态绑定:在程序编译时就能将函数名和具体函数绑定

动态绑定:在程序编译时不能确定到具体的函数,因为虚函数的特性,需要在运行时才能确定具体调用哪个对象的函数。

当类被初始化时,类中的虚函数会被记录到一个虚函数表中,在多态中,当一个指针指向另一个类的对象时,虚函数表则会通过指向的这个类进行更新,在调用虚函数时就会调用指向的这个对象中的具体函数体。基类和派生类会共用一张虚函数表。

 设计模式原则:

1.开闭原则,开放扩展,关闭修改

2.单一职责原则, 一个类应该只有一个引起它变化的原因

3.里氏替换原则,在继承时重写父类方法时需要实现父类方法的职责,避免父类执行程序出错

4.接口隔离原则,不应该强迫客户依赖于他们不用的方法,一般用于类的接口较多,且这些接口涉及的职责较多。

5.组合优先于继承原则:组合的耦合度比继承耦合度低

6.依赖倒转原则:

设计模式:

模板方法模式:定义算法骨架,将一些步骤延时到子类中,使子类不能改变算法的结构

责任链模式:使多个对象有机会处理请求,将这些对象连成链,并沿着这条链传递数据。

 

装饰器模式:动态给对象添加一些额外职责。

 ·

 

 

责任链和装饰器区别:责任链有直接的逻辑顺序,装饰器没有直接逻辑顺序

简单工厂模式:通过工厂类来创建其它类的对象,不符合开闭原则

 

 

 

工厂方法模式:简单工厂模式+开闭原则

 

 

 

抽象工厂模式:

 

 

 

只能增加产品产地,这样不用修改抽象工厂

但是当增加产品种类时,需要在抽象工厂中修改添加创建功能,同时还要添加新添加的抽象产品类。

单例模式:类限制只能创新一个对象,构造函数私有

实现步骤:

1.构造函数私有化

 2.增加静态私有的当前类的指针变量

3.提供对外静态接口来获取单例对象

单例分为饿汉式和懒汉式

饿汉式即在执行主程序前就将对象实例化,在多线程中不会引起多次实例化对象

懒汉式只在调用getInstance()进行实例化对象,在多线程中如果多个线程同时调用getInstance()时可能会造成多次实例化对象,此时就不是单例了。

 

代理模式:为其它对象提供代理控制对对象的访问,抽象代理类,在派生类中判断权限和初始化被代理的对象

外观模式:有一组具有类似功能的类群,提供一个一致的简单界面

适配器模式:

策略模式:定义一系列算法并分别封装起来,且他们之间还可以相互转换

命令模式:

 

观察者模式:

 

 

posted @ 2021-10-18 10:55  tppp  阅读(216)  评论(0)    收藏  举报