编程设计模式(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; }
代码的输出结果如下

很显然,当p指向testB指向的对象时调用print1()方法时,所执行的为类A的print1方法,因为指针p在声明时就将print1方法名和类A中的print1方法进行了静态绑定。
静态绑定:在程序编译时就能将函数名和具体函数绑定
动态绑定:在程序编译时不能确定到具体的函数,因为虚函数的特性,需要在运行时才能确定具体调用哪个对象的函数。
当类被初始化时,类中的虚函数会被记录到一个虚函数表中,在多态中,当一个指针指向另一个类的对象时,虚函数表则会通过指向的这个类进行更新,在调用虚函数时就会调用指向的这个对象中的具体函数体。基类和派生类会共用一张虚函数表。
设计模式原则:
1.开闭原则,开放扩展,关闭修改
2.单一职责原则, 一个类应该只有一个引起它变化的原因
3.里氏替换原则,在继承时重写父类方法时需要实现父类方法的职责,避免父类执行程序出错
4.接口隔离原则,不应该强迫客户依赖于他们不用的方法,一般用于类的接口较多,且这些接口涉及的职责较多。
5.组合优先于继承原则:组合的耦合度比继承耦合度低
6.依赖倒转原则:

设计模式:
模板方法模式:定义算法骨架,将一些步骤延时到子类中,使子类不能改变算法的结构
责任链模式:使多个对象有机会处理请求,将这些对象连成链,并沿着这条链传递数据。

装饰器模式:动态给对象添加一些额外职责。
·
责任链和装饰器区别:责任链有直接的逻辑顺序,装饰器没有直接逻辑顺序
简单工厂模式:通过工厂类来创建其它类的对象,不符合开闭原则

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

抽象工厂模式:

只能增加产品产地,这样不用修改抽象工厂
但是当增加产品种类时,需要在抽象工厂中修改添加创建功能,同时还要添加新添加的抽象产品类。
单例模式:类限制只能创新一个对象,构造函数私有
实现步骤:
1.构造函数私有化
2.增加静态私有的当前类的指针变量
3.提供对外静态接口来获取单例对象
单例分为饿汉式和懒汉式
饿汉式即在执行主程序前就将对象实例化,在多线程中不会引起多次实例化对象
懒汉式只在调用getInstance()进行实例化对象,在多线程中如果多个线程同时调用getInstance()时可能会造成多次实例化对象,此时就不是单例了。
代理模式:为其它对象提供代理控制对对象的访问,抽象代理类,在派生类中判断权限和初始化被代理的对象
外观模式:有一组具有类似功能的类群,提供一个一致的简单界面
适配器模式:
策略模式:定义一系列算法并分别封装起来,且他们之间还可以相互转换
命令模式:

观察者模式:

浙公网安备 33010602011771号