设计模式(一)——设计原则

  在一定环境下,用固定模式解决问题。

  设计模式目前种类:GoF的23种 + “简单工厂模式” = 24种

  包括:

  创建型(Creational)模式:如何创建对象,6种

  结构性(Structual)模式:如何实现类或对象的组合,7种

  行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责,11种

学习设计模式有利于更深理解面向对象思想,让你知道:

  1.如何将代码分散在几个不同的类中?

  2.为什么要有“接口”

  3.何胃针对抽象编程

  4.何时不应该使用继承?

  5.如果不修改源代码增加新功能?

  6.更好低阅读和理解现有类库与其他系统中的源代码?

设计模式的基础:多态(继承,虚函数重写,父类指针或引用指向子类对象)

原则:

  对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的
可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可
复用性是面向对象设计需要解决的核心问题之一。 在面向对象设计中,可维护
性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,
可以从不同的角度提升一个软件结构的设计水平。
  面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计
模式中,它们是从许多设计方案中总结出的指导性原则。 面向对象设计原则也
是我们用于评价一个设计模式的使用效果的重要指标之一。
   

  目标:高内聚,低耦合


  单一职责原则:类的职责单一,对外只提供一种功能

    将每个类的方法分离出来,就能保证每个类的指针单一

    提高安全性

    提高了维护性

    提高了可读性

    

#include <iostream>

using namespace std;

class Clothes
{
public:
    void shopping()
    {
        cout << "休闲的衣服" << endl;
    }
    void working()
    {
        cout << "工作的衣服" << endl;
    }
};

class ClothesShoping
{
public:
    void style()
    {
        cout << "休闲的衣服" << endl;
    }
};

class ClothesWorking
{
public:
    void style()
    {
        cout << "工作的衣服" << endl;
    }
};

int main()
{
    ClothesShoping cs;
    cs.style();

    ClothesWorking cw;
    cw.style();

    system("pause");
    return 0;
}

   开闭原则:类的改动是通过增加代码进行的,而不是修改源代码

        提高了可读性

        提高了安全性

        提高了维护性

        提高了可复用性

#include <iostream>

using namespace std;

// 银行业务员:
class Banker
{
public:
    void save()
    {
        cout << "存款" << endl;
    }
    void pay()
    {
        cout << "支付" << endl;
    }
    void tansfer()
    {
        cout << "转账" << endl;
    }
    // 添加一个办理基金业务 若添加的业务多,则代码会越来越庞大
    void fund()
    {
        cout << "办理基金" << endl;
    }
};

/////////////////////////////////
//////////////////////////////////
// 抽象的银行业务员
//-------------------------------
//-   worker() = 0              -
//-                             -
//-------------------------------
/////////////////////////////////

//////////////////////////////////
// 存款业务员
//-------------------------------
//-                             -
//-     存款                    -
//-------------------------------
/////////////////////////////////
//////////////////////////////////
// 支付业务员
//-------------------------------
//-   支付                      -
//-                             -
//-------------------------------
/////////////////////////////////
//////////////////////////////////
// 转账业务员
//-------------------------------
//-   转账                      -
//-                             -
//-------------------------------
/////////////////////////////////

// 抽象类
// 添加新的业务不需要修改原来代码,只需要添加新代码
class AbstractBanker
{
public:
    virtual void worker() = 0;// 抽象接口
};

class SaveBanker:public AbstractBanker
{
public:
    virtual void worker()
    {
        cout << "存款" << endl;
    }
};

class PayBanker :public AbstractBanker
{
public:
    virtual void worker()
    {
        cout << "支付" << endl;
    }
};

class TransferBanker :public AbstractBanker
{
public:
    virtual void worker()
    {
        cout << "转账" << endl;
    }
};

// 添加一个办理基金业务 若添加的业务多,则代码会越来越庞大
class FundBanker :public AbstractBanker
{
public:
    virtual void worker()
    {
        cout << "基金业务" << endl;
    }
};

int main()
{
#if 0 // 此方法不好
    Banker b;
    b.save();
#endif

    AbstractBanker* ab = new SaveBanker();
    ab->worker();
    ab = new PayBanker();
    ab->worker();
    ab = new TransferBanker();
    ab->worker();

    delete ab;
    system("pause");
    return 0;
}

   依赖倒转原则:依赖于抽象(借口),不要依赖于具体实现(类),也就是针对接口编程

        将业务层和实现层通过抽象层隔离——解耦合   

#include <iostream>
using namespace std;

class Benz
{
public:
    void run()
    {
        cout << "奔驰启动了" << endl;
    }
};

class Baoma
{
public:
    void run()
    {
        cout << "宝马启动了" << endl;
    }
};

class Zhangsan
{
public:
    void driveBenz(Benz* b)
    {
        b->run();
    }
    void driveBMW(Baoma* b)
    {
        b->run();
    }
};

///////////////////////////////////////
// 高层业务逻辑层
//
///////////////////////////////////////

///////////////////////////////////////
// 抽象层
// Driver                   Car
///////////////////////////////////////

///////////////////////////////////////
// 实现层      底层向上依赖
// zhangsan     lisi        baoma benz
///////////////////////////////////////

// 抽象层
class Car
{
public:
    virtual void run() = 0;
};

class Driver
{
public:
    virtual void driver(Car* car) = 0;
};

class Jeep:public Car
{
public:
    virtual void run()
    {
        cout << "吉普启动了" << endl;
    }
};

class Lisi :public Driver
{
public:
    virtual void driver(Car* car)
    {
        cout << "李四开车了" << endl;
        car->run();
    }
};

// 业务
int main()
{
#if 0
    // 让zhangsan 去开benz
    Benz* benz = new Benz;
    Zhangsan* zhangsan = new Zhangsan;
    zhangsan->driveBenz(benz);

    // 让zhangsan 去开benz
    Baoma* BMW = new Baoma;
    zhangsan->driveBMW(BMW);

    // 去开大众,jeep...越写越复杂混乱

    delete benz;
    delete BMW;
    delete zhangsan;
#endif
    // 只使用两个类
    Car* car = new Jeep;
    Driver* lisi = new Lisi;

    lisi->driver(car);

    delete car;
    delete lisi;
    system("pause");
    return 0;
}

    合成复用原则:如果使用继承,会导致父类的任何变换都影响到子类的行为。如果使用对                     象组合,就降低了这种依赖关系。对于继承和组合,优先使用组合。

          如果使用继承方式,那么新的子类将会和所有的父类高耦合

#include <iostream>
using namespace std;

class Cat // 还可以继承动物...
{
public:
    void sleep()
    {
        cout << "小猫睡觉" << endl;
    }
};

// 继承方式
class AdCat :public Cat
{
public:
    void eat_and_sleep()
    {
        cout << "吃东西" << endl;
        sleep();
    }
};

// 使用组合的方式来添加小猫吃东西的方法
// 降低了AdCat2和Cat的耦合度,跟Cat的父类没有任何关系
// 只跟Cat的sleep方法有关系
class AdCat2
{
public:
     AdCat2(Cat* cat)
    {
         this->cat = cat;
    }
     void eat_and_sleep()// 若将cat以参数传入,则是依赖关系
     {
         cout << "吃东西" << endl;
         cat->sleep();
     }
private:
    Cat* cat;// 这种关系是关联
};

int main()
{
    Cat cat;
    AdCat2 adcat(&cat);
    adcat.eat_and_sleep();
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/xiangtingshen/p/10356594.html

时间: 2024-10-03 00:34:09

设计模式(一)——设计原则的相关文章

设计模式——设计模式与设计原则

设计模式--设计模式与设计原则 一.设计模式  1.设计模式简介 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石. 模式的经典定义:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的解决方案,无需再

设计模式之设计原则学习

设计模式的设计原则包含了:单一职责原则.里氏替换原则.依赖倒置原则.接口隔离原则.迪米特法则和开闭原则等6大原则. 单一职责原则(Single Responsibility Principle,简称SRP),英文介绍为:There should never be more than one reason for a class to change,即一个类,应当只有一个引起它变化的原因.单一职责原则,要求对象不能承担太多的职责,充分保证对象的高内聚.单一职责的优点有:1.降低了类的复杂性:2.提

设计模式之设计原则(中)

接口隔离原则(Interface Segregation Principle ),简称ISP:该原则核心思想就是客户端不应该被强迫实现一些不会使用的接口,应该把胖接口中的方法分组,然后用多个接口来代替,每一个接口只服务与一个子模块.这个跟上次分享的单一职责原则类似. 设计接口隔离原则的目的:当我们设计应用程序时,如果一个模块包含多个子模块,那我们应该正对该模块抽象.设想该模块由一个类实现,我们可以把系统抽象成一个接口,但是我们想要添加新的模块扩展程序时,如果要添加的模块只包含原来系统的一些子模块

设计模式与设计原则简介(一)

什么是设计模式? 我们知道对于很多数学问题,经常会有多种不同的解法 而且这其中可能会有一种比较通用简便高效的方法 我们在遇到类似的问题或者同一性质的问题时,也往往采用这一种通用的解法 将话题转移到程序设计中来 对于软件开发人员, 在软件开发过程中, 面临的一般问题的解决方案就是设计模式(准确的说是OOP中) 当然,如同数学的解题思路一样,设计模式并不是公式一样的存在 设计模式(Design pattern)代表了最佳的实践 是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的宝贵经验 是

设计模式与设计原则

0.0 什么是设计模式与设计原则: 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样. 0.1 什么是设计原则: 设计原则是设计模式的基础,所有设计模式都必须遵循设计原则. 设计原则共有七条:单一职责原则.开放-封闭原则.里氏替换原则.依赖倒转原则.接口隔离原则.组合重用原则.迪米特原则. 1. 单一职责原则(Sing

设计模式 - 七大设计原则(一)

设计模式 - 七大设计原则(一) 概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个接口只负责一件事情,只能有一个原因导致类变化 接口隔离原则:使用多个专门的接口,而不是使用一个总接口 迪米特法则(最少知道原则):只和朋友交流(成员变量.方法输入输出参数),不和陌生人说话,控制好访问修饰符 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能 合成复用原则:尽量使用对象组

设计模式之设计原则 C#

成为一名资深架构师首先要懂设计模式,在懂之前,要清楚设计原则,原来我就吃过这个亏,很久以现有人问我设计原则,我是一头茫然,不是只有设计模式吗?且不知设计原则就像是写书法一样,楷体就是方正,竖道有垂露等,隶书横有蚕头燕尾等. 这些"秩序"遵循SOLID architecture principles.这组面向对象的设计原则,通过实践总结为 1),SRP(Single Responsibility Principle):单一责任原则: A class should take care of

设计模式--六大设计原则

1.单一职责原则(SRP ) 定义:Single Responsibility Principle ? 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来: ? 类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案: ? 遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2

设计模式 - 七大设计原则(二)

概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个接口只负责一件事情,只能有一个原因导致类变化 接口隔离原则:使用多个专门的接口,而不是使用一个总接口 迪米特法则(最少知道原则):只和朋友交流(成员变量.方法输入输出参数),不和陌生人说话,控制好访问修饰符 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能 合成复用原则:尽量使用对象组合(has-a)/聚合(conta

【设计模式】设计原则--面向接口编程你理解的对吗?

最近看了<Head First Design Patterns>这本书.正如其名,这本书讲的是设计模式(Design Patterns),而这本书的第一章,讲的是很重要的一些设计原则(Design Principles). Identify the aspects of your application that vary and separate them from what stays the same.(识别应用程序中各个方面的变化,并将它们与保持不变的部分分开.) Program to