实习Day03-设计模式(一)

零. 目标

理解以下内容:
1.为什么用设计模式
2.什么是设计模式
3.怎么用设计模式

一. 为什么用设计模式

对于简单的程序,很显然写一个简单的算法比引入本文说的设计模式要容易的多,也没必要用到设计模式。所以早期的开发人员都是面向过程编程,甚至在我们学习编程之初也是用面向过程的思想来写代码,这无可厚非,因为没必要用屠龙刀去杀鸡。
不过随着市场需求的发展,简单的程序满足不了用户的需要,简单的程序慢慢往小型的项目,大型的项目转型。这个时候用过去那套面向过程的思想做开发,暴露出很多问题,比如代码的复用性,可读性,安全性等。如何解决这些问题,实现更好更有效率的开发?
好在这些问题,很多开发人员都遇到过了,他们总结出一套针对提高代码复用性,可读性,安全性的解决方案。这套解决方案就叫设计模式。

二. 什么是设计模式

1.设计模式的组成要素

1)模式名称:针对不同的应用场景,给不同的设计模式起了相应的名称
2)问题:什么时候使用特定的模式
3)解决方案:就是一套模板,可以应用在同类问题的不同场景下
4)效果:这种设计模式的优缺点

2.七大设计原则

2.1 开闭原则

2.1.1为什么用该原则

我们开发应用的时候常常碰到这样的情况,需求发生改变了。比较傻的做法有两种:
1)去改类文件的源代码,
2)新建一个类,把原来类文件的代码拷贝一部分过来,再做一些改动。
这种做法做个一两次还行,但做多了就会发现弊端:第一种方法老是改动文件源代码的话,代码的复用性太差了。第二种方法则会造成代码的冗余。
那么聪明的做法是什么呢?
3)那就是不改动应用的源代码,而在现有的基础去扩展它.(开闭原则)
那么怎么去实现这一点呢?
面向对象的理念的原则是万物皆对象,进一步地,一类相似属性的对象可以抽象为类,最后把一些类共同都具备的行为抽象为接口.这样做的好处是,接口位于这三层结构的顶层,可以发布一些通用的规则,类去实现这些接口的时候可以有自己的(行为)方法,而对象去实现类的时候又可以有自己的属性.于是产生了不同特征的对象,构成了精彩的大千世界.
基于以上理念,我们可以制定一些不变的规则,即接口,但接口种不做具体的操作,而把具体的产生变化的行为放在类种.那么每当需求发生变化时,只要这种需求还遵循接口中的行为时,我们就可以新建一个实现该接口的类来实现不同的行为.简而言之就是:抽象约束、封装变化.

2.1.2原则定义

当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。

2.1.3怎么用该原则

通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。

2.2 里氏替换原则

面向对象的三大特性:是封装,继承和多态.多态原则已经在开闭原则中已经体现了,那么继续来说说继承.
子类继承父类,子类就可以拿到父类的属性和行为了.这样一来,我们就可以偷懒,不用自己再去重新再写一遍相同的属性和行为了,并且子类出现根父类同名的变量或方法时,子类就不会用父类的,而用自己的.值得一提的是,java中只支持单继承,否则两个父类出现相同的方法,就很头疼去执行哪一个了.

2.2.1为什么用该原则

继承有那么多优点,那么里氏替换原则说的是啥呢?
谨慎用继承!
我们之前说过,子类有自己的行为类型(方法),但具体实现方式又和父类不一样,这看似保留子类的多态性,但可能会造成一些问题.
例如下例,出现除0异常.

class Bird
{
    double flySpeed;
    public void setSpeed(double speed)
    {
        flySpeed=speed;
    }
    public double getFlyTime(double distance)
    {
        return(distance/flySpeed);
    }
}
//燕子类
class Swallow extends Bird{}
//几维鸟类
class BrownKiwi extends Bird
{
    public void setSpeed(double speed)
    {
           flySpeed=0;
    }
}
2.2.2原则定义

子类可以扩展父类的功能,但不能改变父类原有的功能。

2.2.3怎么用该原则

谨慎用继承,使用面向接口编程.

2.3 依赖倒置原则

2.3.1为什么用该原则

过去有两种开发方式,第一种是从面向过程开发,先把一个个过程实现了,然后发现开发过程种有某些对象被反复创建,造成代码的重复,那么我们就去把这些代码抽取成一个个可以复用的方法,进一步地把某类方法再抽取成一个个类.这样的方法没毛病就是效率比后一种低.
第二种就是面向接口编程,
1)开发之初,先预定义好一些接口,制定各个部分的功能,功能不用管具体实现
2)根据这些接口,确定哪些类需要实现哪些功能

2.3.2原则定义

面向接口编程
未完待续…

2.3.3怎么用该原则

2.4 单一原则

2.4.1为什么用该原则
2.4.2原则定义
2.4.3怎么用该原则

2.5 接口隔离原则

2.5.1为什么用该原则
2.5.2原则定义
2.5.3怎么用该原则

2.6 迪米特原则

2.6.1为什么用该原则
2.6.2原则定义
2.6.3怎么用该原则

2.7 合成复用原则

2.7.1为什么用该原则
2.7.2原则定义
2.7.3怎么用该原则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值