写在前面
最近刚刚完成了设计模式的专栏的编写,其实关于设计模式的内容,早都想写点东西总结一下设计模式。为什么特别想写这方面东西,其中很大程度是受了《大话设计模式》这本书的影响,通过阅读这本书,我了解到了设计模式的魅力,也就滋生了要学习并掌握好它的念头。回到这本书本身,有人评价是:把复杂难懂的方法论包含在简单幽默对话中,作者真是厉害!当然,还有另外一种评价:内容写得太简单,有点糊弄人,一点都不严肃、认真!
仔细分辨一下两种评价,从不同方面都反映了这本书的内容确实很简单,阅读门槛是比较低的,这对于那些曾经对理论性的内容感觉枯燥、晦涩难懂的小伙伴来说,是一个好消息,因为这本书本身是一本讲述编程方法、程序设计理念的书,理论性很强,但是内容的组织形式很简单,你完全不会有之前那种对理论性东西晦涩难懂的恐惧。相信你已经看出来了,我对这本书的评介是倾向于第一种的,我认为:仁者见仁,智者见智,书的内容很简单,能否从书中学到东西以及学到多少,那完全凭个人的造化和悟性了,这完全非作者所能左右的了。
关于作者
《大话设计模式》这本书的作者是程杰,从网上能了解到信息是:程杰,国内最畅销计算机图书《大话设计模式》作者。高级软件工程师、高级培训讲师。曾在多家知名IT企业担任过架构师、系统分析师、技术总监等职务,具有丰富的软件开发和管理经验。对软件工程、面向对象程序设计、设计模式等有深入的研究。他曾多次承担各种IT培训课程,包括面向对象程序设计、设计模式、软件测试等,广受学员好评。
重点内容梳理与亮点
《大话设计模式》这本书的核心内容涵盖了面向对象设计、设计原则、UML图、23种设计模式等内容。其中,每一章都会介绍一个或多个设计模式,并通过生动的故事和案例来解释这些设计模式的应用。此外,书中还以情景对话的形式,用多个小故事或编程示例来组织讲解GoF总结的23个设计模式。
具体来说,书中第1、3、4、5章着重讲解了面向对象的意义、好处以及几个重要的设计原则;第2章以及第6到第28章详细讲解了23个设计模式;第29章是对设计模式的全面总结。
这本书在上一版出版至今的长达15年里一直是国内原创计算机类图书畅销榜霸榜产品,与其他相同题材的书相比,《大话设计模式》这本书有以下亮点:
- 通过诙谐幽默的语言和丰富的实例,使得设计模式这一较为抽象和复杂的概念变得更加生动形象,让读者能够轻松理解和应用。
- 采用了师生对话的方式展开讨论,使得读者能够更好地理解设计模式的核心思想和具体应用。
- 书中提供了大量的UML图和实例代码,使得读者能够更直观地了解设计模式的应用和实现方法。
- 本书还提供了丰富的在线资源,如代码示例、在线测试、PPT等,方便读者学习和实践。
总之,《大话设计模式》这本书具有通俗易懂、幽默风趣、实例丰富、图文并茂等特点,非常适合初学者和希望提高面向对象编程能力的读者阅读。
核心内容
《大话设计模式》这本书的核心内容涵盖了面向对象设计、设计原则、UML图以及23种设计模式等方面,旨在帮助读者更好地理解和应用面向对象编程和设计模式的概念和方法
首先介绍了面向对象编程的概念和好处,以及面向对象的主要特征,如封装、继承、多态等。
其次,讲解了几个重要的设计原则,包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则等。这些原则是指导我们如何更好地设计和维护代码的重要准则。
然后,介绍了UML(统一建模语言)中的一些常用图,如类图、时序图、用例图等,以及如何使用这些图来辅助设计。
最后,详细讲解了23种常见的设计模式,包括建造者模式、原型模式、适配器模式、策略模式等。每种模式都通过一个或多个例子来说明其应用和实现方法。
总的来说,它以情景对话的形式展开讨论,通过师生对话的方式将复杂的设计模式问题简单化,使得读者能够轻松理解和应用。同时,书中提供了大量的UML图和实例代码,使得读者能够更直观地了解设计模式的应用和实现方法
对我的启发
《大话设计模式》这本书对我最大的启发可以归纳为以下几点:
- 面向对象设计的意义和好处:书中详细阐述了面向对象设计的核心理念和方法,让我了解到面向对象编程的优越性和实用性,从而更好地理解和应用面向对象设计原则。
- 设计原则的重要性:书中强调了几个重要的设计原则,如单一职责原则、开放封闭原则、里氏替换原则等,这些原则对于指导软件开发和设计具有非常重要的意义。
- 设计模式的实际应用:通过讲解23个设计模式,书中展示了设计模式在实际开发中的应用和作用,让我了解到设计模式是解决常见问题的经验总结,可以有效地提高软件的质量和可维护性。
- 松耦合的重要性:书中强调了松耦合的主旨,即模块之间的依赖关系应该尽可能减少,从而提高系统的可扩展性和可维护性。这给我在编写代码时提供了重要的指导思想。
- 抽象化的重要性:书中介绍了抽象类和接口的使用,强调了针对接口编程而不是针对实现编程的原则,这有助于提高代码的可读性和可维护性。
- 封装的重要性:书中强调了封装的优点和实现方法,通过封装可以将数据和操作封装在一起,提高代码的安全性和可维护性。
- 异常处理的重要性:书中提到了异常处理的最佳实践,包括如何定义和使用异常、如何处理异常等,这有助于提高代码的健壮性和可维护性。
- 测试的重要性:书中强调了测试的重要性,介绍了单元测试和集成测试的方法和最佳实践,这有助于提高代码的质量和可维护性。
- 重用性的重要性:书中强调了重用的重要性,让我了解到通过重用可以提高开发效率和降低维护成本。
- 设计模式的分类和总结:书中对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);}
}