五分钟了解设计模式六大原则(下)

2024-04-29 09:58

本文主要是介绍五分钟了解设计模式六大原则(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 简介
    • 设计模式是什么?
    • 设计模式六大原则是什么?
    • 设计模式有哪些?
  • 依赖倒置原则(Dependence Inversion Principle)
    • 我们应该如何使用依赖倒置原则呢?
  • 接口隔离原则(Interface Segregation Principle)
    • 我们应该如何使用接口隔离原则呢?
  • 开闭原则 (Open Closed Principle)
    • 我们应该如何使用开闭原则呢?

简介

实际上真实项目很难全部遵循,更多的时候会有一些侧重性,设计模式六大原则要能灵活应用,离不开实践的锤炼和思考,把这个真的融入到骨子里面去了,设计确实会不一样的

设计模式是什么?

面向对象语言开发过程中,遇到种种的场景和问题,提出的解决方案和思路,沉淀下来设计模式是解决具体问题的套路

设计模式六大原则是什么?

面向对象语言开发过程中,推荐的一些指导性原则没有明确的招数,而且也经常会被忽视/违背也是前辈总结,也是为了站在前辈的肩膀上

设计模式有哪些?

  1. 单一职责原则(Single Responsibility Principle)
  2. 里氏替换原则(Liskov Substitution Principle)
  3. 迪米特法则 (Law Of Demeter)
  4. 依赖倒置原则(Dependence Inversion Principle)
  5. 接口隔离原则(Interface Segregation Principle)
  6. 开闭原则 (Open Closed Principle)

依赖倒置原则(Dependence Inversion Principle)

高层模块不应该依赖于低层模块,二者应该通过抽象依赖。
	{//面向抽象后,不能使用子类的特别内容Mi student= new Mi();student.Play(phone);student.PlayT(phone);//如果传递的是Mi,Bracelet是有的,但是方法确实不能用//编译器决定了是不能用Bracelet的(dynamic/反射是可以调用的)//不能常规调用,这个问题是解决不了的,//因为面向抽象不止一个类型,用的就是通用功能;非通用的,那就不应该面向抽象}
	public class Student{public int Id { get; set; }public string Name { get; set; }/// <summary>/// 依赖细节  高层就依赖了底层/// </summary>/// <param name="phone"></param>public void PlayMi(Mi phone){Console.WriteLine("这里是{0}", this.Name);phone.Call();phone.Text();phone.Bracelet();//要用手环功能}public void Play(AbstractPhone phone){Console.WriteLine("这里是{0}", this.Name);phone.Call();phone.Text();//phone.Bracelet();}public void PlayT<T>(T phone) where T : AbstractPhone{Console.WriteLine("这里是{0}", this.Name);phone.Call();phone.Text();}}
	public class Mi : AbstractPhone{public override void Call(){Console.WriteLine("User {0} Call", this.GetType().Name);}public override void Text(){Console.WriteLine("User {0} Text", this.GetType().Name);}public void Bracelet(){Console.WriteLine("User {0} Bracelet", this.GetType().Name);}}
	public abstract class AbstractPhone{public int Id { get; set; }public string Branch { get; set; }public abstract void Call();public abstract void Text();}
像PlayMi方法就是高层直接依赖了底层。使用泛型或抽象类型就可以避免这个问题。但面向抽象后,不能使用子类的特别内容,若一定要使用可以通过反射的方式。

我们应该如何使用依赖倒置原则呢?

  1. 面向抽象,只要抽象不变,高层就不变
  2. 面向对象语言开发,就是类与类之间进行交互,如果高层直接依赖低层的细节,细节是多变的,那么低层的变化就导致上层的变化;如果层数多了,底层的修改会直接水波效应传递到最上层,一点细微的改动都会导致整个系统从下往上的修改
  3. 面向抽象,如果高层和低层没有直接依赖,而是依赖于抽象,抽象一般是稳定的,那低层细节的变化扩展就不会影响到高层,这样就能支持层内部的横向扩展,不会影响其他地方,这样的程序架构就是稳定的
  4. 依赖倒置原则(理论基础)—IOC控制反转(实践封装)—DI依赖注入(实现IOC的手段)

接口隔离原则(Interface Segregation Principle)

客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上;
	Student student = new Student(){Id = 191,Name = "张三"};{IExtendVideo camera = new Camera();student.Video(camera);}{IExtendHappy extend = new TV();student.Happy(extend);}{IExtendGame extend = new PSP();student.Happy(extend);}
public interface IExtend{//void Photo();//void Online();//void Game();void Record();//void Movie();void Map();//void Pay();}//都拆成一个方法一个接口//电视--上网 玩游戏public interface IExtendHappy : IExtendGame{void Online();//void Game();}//掌中游戏机:俄罗斯方块--玩游戏不能上网public interface IExtendGame{void Game();}public interface IExtendVideo{void Photo();void Movie();//打开相机--切换模式--start--Suspend--End}
	public class Student{public int Id { get; set; }public string Name { get; set; }public void Video(IExtendVideo extend){extend.Photo();extend.Movie();}public void Happy(IExtendGame extend){extend.Game();}}
尽量少声明大而全的接口,将接口更加细致的拆分,当然都拆成一个方法一个接口,肯定也不好!可以参考官方提供的类型例子
例如:List<> 它继承Dictionary,IList<T>  (索引相关),ICollection<T>  集合相关操作,IEnumerable<T>  迭代器foreach

我们应该如何使用接口隔离原则呢?

  1. 既不能是大而全,会强迫实现没有的东西,也会依赖自己不需要的东西
  2. 也不能一个方法一个接口,这样面向抽象也没有意义的。按照功能的密不可分来定义接口,而且应该是动态的,随着业务发展会有变化的,但是在设计的时候,要留好提前量,避免抽象的变化。这个没有标准答案,随着业务和产品来调整的。
  3. 接口需要进行合并 ()例如:Map接口 需要继承 定位/搜索/导航) 这种属于固定步骤,业务细节,尽量的内聚,在接口也不要暴露太多业务细节

开闭原则 (Open Closed Principle)

对扩展开发,对修改关闭
面向对象语言是一种静态语言,最害怕变化,会波及很多东西又会涉及到全面测试。所以最理想就是新增类,对原有代码没有改动,原有的代码才是可信的。
开闭原则只是一个目标,并没有任何的手段,也被称之为总则。其他5个原则的建议,就是为了更好的做到OCP,也就是最终的目标——减少对原有代码的改动。

我们应该如何使用开闭原则呢?

按照修改的波及来排名:修改现有方法 > 增加方法 > 增加类 > 增加/替换类库

修改原有的方法对项目的影响最大。替换类DLL对项目影响最小。

这篇关于五分钟了解设计模式六大原则(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945775

相关文章

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一