设 计 模 式

文章介绍了软件开发中的几种重要设计模式,包括单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则和迪米特法则等面向对象设计原则,并通过实例展示了单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)以及观察者模式的应用。
摘要由CSDN通过智能技术生成

设计模式

1. 单一职责原则(Single-Responsibility-Principle)
    该原则是针对类来说的,即一个类应该只负责一项职责。如类T负责两个不同职责:职责P1,职责P2。当职责P1需求变更而改变T时,可能造成职责P2发生故障,所以需要将类T的粒度分解为T1,T2。

2. 开闭原则(Open Close Principle)
    对扩展开放,对修改关闭

3. 里氏代换原则(Liskov Substitution Principle)
    该原则是在1988年,由麻省理工学院的一位姓里的女士提出的。 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。 

    换句话说,所有引用基类的地方必须能透明地使用其子类的对象。 
由定义可知,在使用继承时,遵循里氏替换原则,在子类中尽量不要重写和重载父类的方法。
    继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。

4. 依赖倒转原则(Dependence Inversion Principle)
    高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。

5. 接口隔离原则(Interface Segregation Principle)
    客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 
类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类C来说不是最小接口,则类B和类D必须去实现他们不需要的方法。如果将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

6. 迪米特法则,又称最少知道原则(Demeter Principle)
    一个对象应该对其他对象保持最少的了解。类与类关系越密切,耦合度越大。迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。

7. 合成复用原则(Composite Reuse Principle)
   合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

#include <iostream>
using namespace std;

class ElaphanToFridge{
public:
    void templateStep(){     方法、办法
        firstStep();
        secondStep();
        thirdStep();
    }
protected:
    virtual void firstStep() = 0;
    virtual void secondStep() {cout << "Second step" << endl;}
    virtual void thirdStep() = 0;
};

class Somth : public ElaphanToFridge{      //事件
    void firstStep(){ cout << "First step" << endl; }
    void thirdStep(){ cout << "Third step" << endl; }
};

int main()
{
    ElaphanToFridge obj;
    obj.templateStep();
    
    return 0;
}

单例模式:构造析构拷贝构造私有,静态函数使用静态私有成员调用分配内存

#include <iostream>
using namespace std;

class Single{
public:
    static Single * createHandler()
    {    
        if(handler == NULL)
        {
            handler = new Single();
        }
        return handler;
    }
    
    void destroyHandler(){
        if(handler != NULL){
            delete handler;
            handler = NULL;
        }
    }

private:
   Single(){}
   Single(const Single& o){}
   ~Single(){}
   static Single *handler;
};

Single *Single::handler = NULL;

int main()
{
    Single *ptr = Single::createHandler();
    Single *str = Single::createHandler();
    return 0;
}

工厂模式

#include <iostream>
using namespace std;
//观察者模式
//工厂模式:简单工厂,工厂方法,抽象工厂

class Product{
    virtual void show() = 0;
};

class ProductA : public Product{
public:
    void show(){ cout << "ProductA" << endl; }
};

class ProductB : public Product{
    void show(){ cout << "ProductB" << endl; }
};

class ProductC : public Product{
    void show(){ cout << "ProductC" << endl;}
};

class Factory{
public:
    Product *getProduct(int type){
        if(type == 1){
            return new ProductA();
        }else if(type ==2){
            return new ProductB();
        }else{
            return new ProductC();
        }
    }
};

int main()
{
    Factory f;
    Product *p = f.getProduct(1);
    p->show();
    return 0;
}

工厂方法:一个工厂对应一个产品

#include <iostream>
using namespace std;
//观察者模式
//工厂模式:简单工厂,工厂方法,抽象工厂

class Product{
    virtual void show() = 0;
};

class ProductA : public Product{
public:
    void show(){ cout << "ProductA" << endl; }
};

class ProductB : public Product{
    void show(){ cout << "ProductB" << endl; }
};

class ProductC : public Product{
    void show(){ cout << "ProductC" << endl;}
};

class Factory{
public:
    virtual Product *getProduct() = 0;
};

class FactoryA : public Factory{
public:
    virtual Product *getProduct() {
        return new ProductA();
    }
};

class FactoryB : public Factory{
    virtual Product *getProduct() {
        return new ProductB();
    }
};

class FactoryC : public Factory{
    virtual Product *getProduct() {
        return new ProductC();
    }
};

int main()
{
    Factory *f = new FactoryA;
    Product *p = f->getProduct();
    p->show();
    return 0;
}

抽象工厂

#include <iostream>
using namespace std;
//观察者模式
//工厂模式:简单工厂,工厂方法,抽象工厂

class Car{
public:
    virtual void show() = 0;
};

class BmwCar : public Car{
public:
    virtual void show() {
        cout << "BmwCar" << endl;
    }    
};

class BydCar : public Car{
public:
    virtual void show() {
        cout << "BydCar" << endl;
    }

class Suv{
public:
    virtual void test() = 0;
};

class BmwSuv : public Suv{
public:
    virtual void test() {
        cout << "BmwSuv" << endl;
    }
};

class BydSuv : public Suv{
public:
    virtual void test() {
        cout << "BydSuv" << endl;
    }
};


class CarFactory{
public:
    virtual Car *createCar() = 0;
    virtual Suv *createSuv() = 0;
};

class BmwCarFactory : public CarFactory{
public:
    virtual Car *createCar() {
        return new BmwCar();
    }
    virtual Suv *createSuv() {
        return new BmwSuv();
    }
};

class BydCarFactory : public CarFactory{
public:
    virtual Car *createCar() {
        return new BydCar();
    }
    virtual Suv *createSuv() {
        return new BydSuv();
    }
};

int main()
{
    CarFactory *f = new BmwCarFactory;
    Car *c = f->createCar();
    p->show();

    Suv *s = f->createSuv();
    p->show();

    return 0;
}

观察者模式

#include <iostream>
#include <list>
using namespace std;
//观察者模式
//工厂模式:简单工厂,工厂方法,抽象工厂

class Subject {
public:
    virtual void update() = 0;
};

class GameSubject : public Subject{
public:
    virtual void update() { cout << "GameSubject" << endl; }
};

class StorySubject : public Subject{
public:
    virtual void update() { cout << "StorySubject" << endl; }
};

class Observer{
public:
    void detach(Subject *sub) {
        m_sub.remove(sub);
    }
    void attach(Subject *sub) {
        m_sub.push_back(sub);
    }
    void notify(Subject *sub) {
        list<Subject *>::iterator it;
        for(it = sub.begin(); it != sub.end(); ++it){
            (*it)->update();
        }
    }
private:
    list<Subject *> m_sub;
};

int main()
{
    GameSubject sub1;
    StorySubject sub2;

    Observer obj;
    obj.attach(&sub1);
    obj.attach(&sub2);
    obj.notify();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值