👨🎓作者简介:一位喜欢写作,计科专业大三菜鸟
🏡个人主页:starry陆离
🕒首发日期:2022年9月2日星期五
🍁每日推荐:牛客网-面试神器
24 理论课时 + 8 实践课时
设计模式是一门与语言无关的课程,设计模式是一种软件设计的方法,用于指导软件的开发;通过学习设计模式我们更好的理解Java的三大特性:封装,继承。多态。
在大二上学期时初学java,乃至到现在我都不太能描叙Java的三大特性究竟为何,为什么要这么设计,希望通过这门课程加深理解与体会。
老师课堂上提出了一个让我欲言又止的问题:为什么要有接口?
当时在课上我有一种可意会不可言传的感受,不知道怎们描述。老师给出了答案:扩展,接口可以扩展。
对于接口的基础知识课后我也做了一些复习:
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface
来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
某软件公司要开发一个跨平台图像浏览系统。要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、Unix等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。
这种设计采用了多层继承结构,虽然能实现功能,但是扩展性极差,并且具体类个数太多。无论是增加新的图像文件格式还是增加新的操作系统,都需要增加大量的具体类。
某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:
(1) 学生凭学生证可享受票价8折优惠;
(2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);
(3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的礼品。
该系统在将来可能还要根据需要引入新的打折方式。
public class MovieTicket {
private double price;
//compute the price
public double calculate(String type) {
//student ticket
if(type.equalsIgnoreCase("student")) {
return this.price * 0.8;
}
//children ticket
else if(type.equalsIgnoreCase("children") && this.price >= 20 ) {
return this.price - 10;
}
//VIP ticket
else if(type.equalsIgnoreCase("vip")) {
//add points, code is omitted
return this.price * 0.5;
}
else {
return this.price;
}
}
}
对于解决某个具体问题,一个类一个方法来解决是我们常用的思路和方法。但现在这是一个系统,要求能引入新的打折方式,那么只能修改这个方法,再写几个if-else
,这在设计模式中也是不规范的。如果企图用一个类或一个方法去设计一个系统,不利于系统或方法的测试和维护,系统的灵活性和扩展性也会很差,并且代码复用性差。
某软件公司在开发一个银行业务处理系统时需要对其中的机密数据进行加密处理,通过分析发现,用于加密的程序已经存在于一个第三方算法库中,但是没有该算法库的源代码。在系统初始设计阶段,已定义数据操作接口DataOperation
,且该接口已被很多同事使用,对该接口的修改势必导致大量代码需要产生改动。
如何在既不修改现有接口又不需要算法库源代码的基础上能够实现第三方算法库的重用是该软件公司开发人员必须面对的问题。
这里客户端类指的是我们自己开发的类,而我们调用的算法库,成为库类。如我们用的JDK就是一个库类,我们设计的系统或程序中的类调用JDK中的方法,这些类就是客户端类。
至于如何解决这个问题后面学到了适配器模式再做展开。
通过这三个实例我们可以发现在日常的开发中,我们经常会遇到这些问题,那么就需要一种理论或方法来指导我们的开发,让我们的系统、软件更“轻”,更“小”,更易“扩展”,更易“复用”。这便是学习设计模式的原因。
模式(Pattern)起源于建筑业而非软件业
模式之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士
《A Pattern Language: Towns, Buildings, Construction》——253个建筑和城市规划模式
Alexander给出了关于模式的经典定义:
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,人们可以无数次地重用那些已有的解决方案,无须再重复相同的工作。
Context(模式可适用的前提条件)
Theme或Problem(在特定条件下要解决的目标问题)
Solution(对目标问题求解过程中各种物理关系的记述)
20世纪80年代末,软件工程界开始关注Christopher Alexander等在这一住宅、公共建筑与城市规划领域的重大突破
“四人组(Gang of Four,GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”于1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟
1990年,“四人组” 正式成立,并开始着手进行设计模式的分类整理工作
1995年,“四人组”出版了**《设计模式:可复用面向对象软件的基础》**(Design Patterns: Elements of Reusable Object-Oriented Software)一书,本书成为1995年最抢手的面向对象书籍,也成为设计模式的经典书籍
软件模式:在一定条件下的软件开发问题及其解法
问题描述:重复出现的问题
前提条件(环境或约束条件)
解法:类图,核心代码、实例
效果:模式的优缺点
大三律 (Rule of Three)
只有经过3个以上不同类型(或不同领域)的系统的校验,一个解决方案才能从候选模式升格为模式
一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结
目的:为了可重用代码、让代码更容易被他人理解、提高代码的可靠性
设计模式一般包含模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式等基本要素
模式名称 (Pattern Name)
问题 (Problem)
解决方案 (Solution)
效果 (Consequences)
根据**目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)**三类:
创建型模式主要用于创建对象
结构型模式主要用于处理类或对象的组合
行为型模式主要用于描述类或对象如何交互和怎样分配职责
根据范围,即模式主要是处理类之间的关系还是处理对象之间的关系,可分为类模式和对象模式两种:
类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是一种静态关系
对象模式处理对象间的关系,这些关系在运行时变化,更具动态性
设计模式前的数字为该模式的使用频率
融合了众多专家的经验,并以一种标准的形式供广大开发人员所用
提供了一套通用的设计词汇和一种通用的语言,以方便开发人员之间进行沟通和交流,使得设计方案更加通俗易懂
让人们可以更加简单方便地复用成功的设计和体系结构
使得设计方案更加灵活,且易于修改
将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本
有助于初学者更深入地理解面向对象思想,方便阅读和学习现有类库与其他系统中的源代码,还可以提高软件的设计水平和代码质量