《大话设计模式》让设计模式不再高深,连傻瓜都可以读得懂

 

写在前面

        最近刚刚完成了设计模式的专栏的编写,其实关于设计模式的内容,早都想写点东西总结一下设计模式。为什么特别想写这方面东西,其中很大程度是受了《大话设计模式》这本书的影响,通过阅读这本书,我了解到了设计模式的魅力,也就滋生了要学习并掌握好它的念头。回到这本书本身,有人评价是:把复杂难懂的方法论包含在简单幽默对话中,作者真是厉害!当然,还有另外一种评价:内容写得太简单,有点糊弄人,一点都不严肃、认真!

        仔细分辨一下两种评价,从不同方面都反映了这本书的内容确实很简单,阅读门槛是比较低的,这对于那些曾经对理论性的内容感觉枯燥、晦涩难懂的小伙伴来说,是一个好消息,因为这本书本身是一本讲述编程方法、程序设计理念的书,理论性很强,但是内容的组织形式很简单,你完全不会有之前那种对理论性东西晦涩难懂的恐惧。相信你已经看出来了,我对这本书的评介是倾向于第一种的,我认为:仁者见仁,智者见智,书的内容很简单,能否从书中学到东西以及学到多少,那完全凭个人的造化和悟性了,这完全非作者所能左右的了。

关于作者

        《大话设计模式》这本书的作者是程杰,从网上能了解到信息是:程杰,国内最畅销计算机图书《大话设计模式》作者。高级软件工程师、高级培训讲师。曾在多家知名IT企业担任过架构师、系统分析师、技术总监等职务,具有丰富的软件开发和管理经验。对软件工程、面向对象程序设计、设计模式等有深入的研究。他曾多次承担各种IT培训课程,包括面向对象程序设计、设计模式、软件测试等,广受学员好评。

重点内容梳理与亮点

        《大话设计模式》这本书的核心内容涵盖了面向对象设计、设计原则、UML图、23种设计模式等内容。其中,每一章都会介绍一个或多个设计模式,并通过生动的故事和案例来解释这些设计模式的应用。此外,书中还以情景对话的形式,用多个小故事或编程示例来组织讲解GoF总结的23个设计模式。

        具体来说,书中第1、3、4、5章着重讲解了面向对象的意义、好处以及几个重要的设计原则;第2章以及第6到第28章详细讲解了23个设计模式;第29章是对设计模式的全面总结。

        这本书在上一版出版至今的长达15年里一直是国内原创计算机类图书畅销榜霸榜产品,与其他相同题材的书相比,《大话设计模式》这本书有以下亮点:

  1. 通过诙谐幽默的语言和丰富的实例,使得设计模式这一较为抽象和复杂的概念变得更加生动形象,让读者能够轻松理解和应用。
  2. 采用了师生对话的方式展开讨论,使得读者能够更好地理解设计模式的核心思想和具体应用。
  3. 书中提供了大量的UML图和实例代码,使得读者能够更直观地了解设计模式的应用和实现方法。
  4. 本书还提供了丰富的在线资源,如代码示例、在线测试、PPT等,方便读者学习和实践。

总之,《大话设计模式》这本书具有通俗易懂、幽默风趣、实例丰富、图文并茂等特点,非常适合初学者和希望提高面向对象编程能力的读者阅读。

核心内容

        《大话设计模式》这本书的核心内容涵盖了面向对象设计、设计原则、UML图以及23种设计模式等方面,旨在帮助读者更好地理解和应用面向对象编程和设计模式的概念和方法

        首先介绍了面向对象编程的概念和好处,以及面向对象的主要特征,如封装、继承、多态等。

        其次,讲解了几个重要的设计原则,包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则等。这些原则是指导我们如何更好地设计和维护代码的重要准则。

        然后,介绍了UML(统一建模语言)中的一些常用图,如类图、时序图、用例图等,以及如何使用这些图来辅助设计。

        最后,详细讲解了23种常见的设计模式,包括建造者模式、原型模式、适配器模式、策略模式等。每种模式都通过一个或多个例子来说明其应用和实现方法。

        总的来说,它以情景对话的形式展开讨论,通过师生对话的方式将复杂的设计模式问题简单化,使得读者能够轻松理解和应用。同时,书中提供了大量的UML图和实例代码,使得读者能够更直观地了解设计模式的应用和实现方法

对我的启发

        《大话设计模式》这本书对我最大的启发可以归纳为以下几点:

  1. 面向对象设计的意义和好处:书中详细阐述了面向对象设计的核心理念和方法,让我了解到面向对象编程的优越性和实用性,从而更好地理解和应用面向对象设计原则。
  2. 设计原则的重要性:书中强调了几个重要的设计原则,如单一职责原则、开放封闭原则、里氏替换原则等,这些原则对于指导软件开发和设计具有非常重要的意义。
  3. 设计模式的实际应用:通过讲解23个设计模式,书中展示了设计模式在实际开发中的应用和作用,让我了解到设计模式是解决常见问题的经验总结,可以有效地提高软件的质量和可维护性。
  4. 松耦合的重要性:书中强调了松耦合的主旨,即模块之间的依赖关系应该尽可能减少,从而提高系统的可扩展性和可维护性。这给我在编写代码时提供了重要的指导思想。
  5. 抽象化的重要性:书中介绍了抽象类和接口的使用,强调了针对接口编程而不是针对实现编程的原则,这有助于提高代码的可读性和可维护性。
  6. 封装的重要性:书中强调了封装的优点和实现方法,通过封装可以将数据和操作封装在一起,提高代码的安全性和可维护性。
  7. 异常处理的重要性:书中提到了异常处理的最佳实践,包括如何定义和使用异常、如何处理异常等,这有助于提高代码的健壮性和可维护性。
  8. 测试的重要性:书中强调了测试的重要性,介绍了单元测试和集成测试的方法和最佳实践,这有助于提高代码的质量和可维护性。
  9. 重用性的重要性:书中强调了重用的重要性,让我了解到通过重用可以提高开发效率和降低维护成本。
  10. 设计模式的分类和总结:书中对23个设计模式进行了分类和总结,有助于我更好地理解和记忆这些设计模式。

        总之,我认为《大话设计模式》这本书不仅介绍了设计模式的概念和应用,还通过实例和案例展示了面向对象设计的思想和原则,对于提高软件开发人员的水平具有很大的帮助。

对于设计模式我最印象深刻的应用,应该要属于对策略模式和简单工厂模式的综合应用了,实际业务场景比较复杂,在这里我举一个类似的例子,相信大家一看就明白了。

很多购物网站都有会员业务,不同等级的会员可以享受不同程度的优惠,这里假设某会员业务系统的会员等级有非会员、初级会员、中级会员、高级会员四个等级,其中非会员在支付的时候需要全额支付 ,初级会员可以享受8折优惠,中级会员可以享受7折优惠,高级会员可以享受5折优惠,如果需要写一个支付接口,需要怎么实现呢?

写在最后

1、定义抽象的支付策略接口:PayStrategy.java;

/*** 支付策略接口*/
public interface PayStrategy {/*** 实际支付金额计算* @param money*/Double compute(Double money);
}

2、定义具体的支付策略类:Level0Streategy.java、Level1Streategy.java、Level2Streategy.java、Level3Streategy.java

/*** 非会员计费策略*/
public class Level0Strategy implements PayStrategy{@Overridepublic Double compute(Double money) {System.out.println("非会员开始计费");return money;}
}
/*** 初级会员计费策略*/
public class Level1Strategy implements PayStrategy{@Overridepublic Double compute(Double money) {System.out.println("初级会员开始计费");return money*0.8;}
}
/*** 中级会员计费策略*/
public class Level2Strategy implements PayStrategy{@Overridepublic Double compute(Double money) {System.out.println("中级会员开始计费");return money*0.7;}
}
/*** 高级会员计费策略*/
public class Level3Strategy implements PayStrategy{@Overridepublic Double compute(Double money) {System.out.println("高级会员开始计费");return money*0.5;}
}

3、定义用于存储和传递策略的上下文:StreateContext.java

/*** 支付策略上下文*/
public class StrategyContent {private PayStrategy payStrategy;public StrategyContent(PayStrategy payStrategy) {this.payStrategy = payStrategy;}/*** 支付方法* @param money* @return*/public Double pay(Double money){return this.payStrategy.compute(money);}
}

4、定义策略工厂类,用于生产具体的策略:PayStreategyFactory.java

/*** 策略工厂*/
public class PayStrategyFactory {public static PayStrategy getStrategy(Member member){PayStrategy payStrategy;switch (member.getLevel()){case "初级":payStrategy=new Level1Strategy();break;case "中级":payStrategy=new Level2Strategy();break;case "高级":payStrategy=new Level3Strategy();break;default:payStrategy=new Level0Strategy();break;}return payStrategy;}
}

5、编写客户端:,模拟不同的用户进行支付:Test.java

@Data
@AllArgsConstructor
public class Member {/*** 会员姓名*/private String name;/*** 会员等级:非会员、初级、中级、高级*/private String level;/*** 支付金额*/private Double pay;
}
public class Test {public static void main(String[] args) {Member member = new Member("小明", "初级", 100.00);PayStrategy strategy = PayStrategyFactory.getStrategy(member);StrategyContent strategyContent = new StrategyContent(strategy);Double pay = strategyContent.pay(member.getPay());System.out.println(member.getName() + "应支付金额:" + member.getPay() + ",实际支付金额:" + pay);member = new Member("小红", "中级", 100.00);strategy = PayStrategyFactory.getStrategy(member);strategyContent = new StrategyContent(strategy);pay = strategyContent.pay(member.getPay());System.out.println(member.getName() + "应支付金额:" + member.getPay() + ",实际支付金额:" + pay);member = new Member("铁蛋", "高级", 100.00);strategy = PayStrategyFactory.getStrategy(member);strategyContent = new StrategyContent(strategy);pay = strategyContent.pay(member.getPay());System.out.println(member.getName() + "应支付金额:" + member.getPay() + ",实际支付金额:" + pay);member = new Member("李刚", "非会员", 100.00);strategy = PayStrategyFactory.getStrategy(member);strategyContent = new StrategyContent(strategy);pay = strategyContent.pay(member.getPay());System.out.println(member.getName() + "应支付金额:" + member.getPay() + ",实际支付金额:" + pay);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177377.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优思学院|一文快速看懂TRIZ原理

在创新领域,TRIZ被翻译为发明问题的解决理论。TRIZ理论深刻揭示了创造发明的内在规律和原理,专注于澄清和强调系统中存在的矛盾,旨在完全解决这些矛盾,实现最终的理想解决方案。实践证明,运用TRIZ理论不仅能够极大地加…

如何搭建属于自己的AI数字人直播SAAS系统?

随着人工智能技术的不断发展,AI数字人直播正成为互联网行业的新宠。面向未来的AI数字人直播系统无疑是直播领域的新风口。虽然拥有众多优势,但从0到1搭建这个系统可能存在着资源、技术和时间的挑战。那么,如何可以快速搭建属于自己的AI数字人…

识别伪装IP的网络攻击方法

识别伪装IP的网络攻击可以通过以下几种方法: 观察IP地址的异常现象。攻击者在使用伪装IP地址进行攻击时,往往会存在一些异常现象,如突然出现的未知IP地址、异常的流量等。这些现象可能是攻击的痕迹,需要对此加以留意。 检查网络通…

《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS

title: 《网络协议》06. HTTP 补充 HTTPS SSL/TLS date: 2022-10-06 18:09:55 updated: 2023-11-15 07:53:52 categories: 学习记录:网络协议 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。 comments: fa…

Arm Cortex R52与TC3xx Aurix上下文切换对比

目录 1.Arm Cortex R52上下文切换 2.英飞凌TC3xx的CPU上下午切换 2.1 上下文类型 2.2 Task Switching Operation 2.3 Context管理寄存器 2.4 各种事件的上下文切换 2.4.1 中断/Trap的上下文切换 2.4.2 函数调用的上下文切换 2.4.3 FCALL/FRET的上下文切换 2.5 Contex…

【nlp】2.3 LSTM模型

LSTM模型 1 LSTM介绍2 LSTM的内部结构图2.1 LSTM结构分析2.2 Bi-LSTM介绍2.3 使用Pytorch构建LSTM模型2.4 LSTM优缺点1 LSTM介绍 LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸…

基于opencv的边缘检测方法

1、梯度运算 用OpenCV的形态变换( 膨胀、腐蚀、开运算和闭运算)函数morphologyEx 梯度运算即膨胀结果-腐蚀结果: 【注意】对于二值图像来说,必须是前景图像为白色,背景为黑色,否则需要进行反二值化处理 …

C语言题目逻辑实战总结

eg1: 已知有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少 已知:1:三位数 ,2:1-4,3:各不相同, 输出:1:有多少个这样的三位数,2&#xff…

十方影视后期“领进门”,成长与成就还得靠自身

在这个充满视觉冲击的时代,影视后期制作已经成为了一种炙手可热的艺术形式。而在这个领域,Adobe After Effects(AE)这款软件无疑是王者之一。十方影视后期作为十方教育科技旗下的艺术设计学科,不仅培养了数万名优秀的后…

【Regulatory Genomics】Part2 BPNet、DeepLIFT

文章目录 Deep learning at base-resolution reveals cis-regulatory motif syntaxproblemBPNet: predicting base-resolution profiles from DNA sequenceInterpreting the predictions of BPNet1 DeepLIFT2 TF-MoDISCO3 motif syntax derived TF cooperativity Experimental …

首发!动手学大模型应用开发教程来了

大模型正逐步成为信息世界的新革命力量,其通过强大的自然语言理解、自然语言生成能力,为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的大模型 API 服务开放,如何基于大模型 API 快速、便捷地开发具备更强能力、集成大模型的应…

微信小程序漏洞之accesskey泄露

更新时间:2023年09月08日09:42:52 1. Accesskey泄露漏洞 这篇文章里面都是以我个人的视角来进行的,因为一些原因,中间删了一些东西,肯定有很多不正确的地方,希望大家能理解,也能指正其中的错误。 在以前…