热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

设计模式_03六大设计原则

设计模式_03六大设计原则设计模式_03六大设计原则开闭原则里氏代换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则设计模式_03六大设计原则开闭原则对扩展开放,


设计模式_03 六大设计原则

  • 设计模式_03 六大设计原则
    • 开闭原则
    • 里氏代换原则
    • 依赖倒转原则
    • 接口隔离原则
    • 迪米特法则
    • 合成复用原则


设计模式_03 六大设计原则


开闭原则

对扩展开放,对修改关闭
通过接口和抽象类来实现。
代码实现:

class Abstract_father {
public:virtual void func() = 0;
};class son1 : Abstract_father {
public:void func() {cout << "son1" << endl;}
};

里氏代换原则

任何基类可以出现的地方,子类一定可以出现。
子类可以扩展父类的功能,但不能改变父类原有的功能(尽量不要重写父类的方法)。运用多态非常频繁时,程序出错的概率很大。


依赖倒转原则

高层模块不应该依赖于低层类。
两者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。对抽象进行编程


接口隔离原则

客户端不应该被迫依赖于它不使用 的方法。
一个类对另一个类的依赖应该建立在最小的接口上。
原始案例:

class Abstract_father {
public:virtual void func1() = 0;virtual void func2() = 0;
};class son1 : Abstract_father {
public:void func1() {cout << "son1" << endl;}void func2() {} //不需要使用的方法
};

改进案例:

class Abstract_father {
public:virtual void func1() = 0;
};class Abstract_Mother {
public:virtual void func2() = 0;
};class son1 : Abstract_father {
public:void func1() {cout << "son1" << endl;}
};

迪米特法则

如果两个软件实体无需直接通信,那么就不应该发生直接的相互调用,可以通过第三方(中介)转发该调用。

class house_searcher {
public:string searcherName() {string name = "searcher";return name;}
};class house_host {
public:string hostName() {string name = "host";return name;}
};//不直接通信,而是通过中介建立联系
class agent {
private:house_searcher searcher;house_host host;
public:void getName() {cout << searcher.searcherName() << &#39; &#39; << host.hostName() << endl;}
};

合成复用原则

尽量先使用组合或者聚合等关系来实现,齐次再考虑继承关系。
类的复用分为继承复用合成复用

继承复用缺点:
1.继承关系破坏了父类的封装特性。子类可以对父类方法进行重写。
2.子类和父类耦合度高。父类进行修改,子类需要相应进行修改。
3.限制了复用的灵活性。在运行时继承关系不可被修改。

合成复用的优点:
1.维持了类的封装性。
2.对象间的耦合度低。
3.复用的灵活性高。新对象可以动态引用与成员对象类型相同的对象。

继承复用代码:

class Car {
public:virtual void show() {cout << "car" << endl;}
};class electricCar : Car {
public:virtual void show() {cout << "electriCar" << endl;}
};class whiteElectricCar : electricCar {
public:virtual void show() {cout << "whiteElectricCar" << endl;}
};class redElectricCar : electricCar {
public:virtual void show() {cout << "redElectricCar" << endl;}
};

合成复用代码:

class Color {
public:void show() {cout << "red ";}
};class Car {
protected:Color color;
public:virtual void show() {Car::color.show();cout << "Car" << endl;}
};class electricCar : Car {
public:virtual void show() {Car::color.show();cout << "electriCar" << endl;}
};

推荐阅读
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • andr ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 单片机与PLC:入门难易度及应用场景对比
    本文探讨了单片机和PLC的学习难度及各自的应用场景,帮助读者根据自身需求选择合适的学习路径。单片机是一种微控制器,而PLC(可编程逻辑控制器)则专为工业自动化设计。两者各有优劣,适合不同的应用领域。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文详细探讨了C语言中指针的概念,特别是指针在变量和数组中的应用。通过实例讲解,帮助读者更好地掌握指针的使用方法。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 如何在Win10系统中显示文件的扩展名
    为了更方便地区分不同类型的文件,用户可以在Windows 10操作系统中设置文件显示其扩展名。本文将详细介绍具体的操作步骤和相关技巧,帮助您更好地管理和识别文件。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
author-avatar
楼兰祈珞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有