23种设计模式入门 - 设计模式概述及七大原则

设计模式的目的

使程序拥有更好的的

  1. 代码复用性(一次编译,处处运行[手动狗头])
  2. 可读性(不可替代性堪忧呀)
  3. 可扩展性(新增功能时方便)
  4. 可靠性(新增功能后对旧功能没有影响)
  5. 高内聚,低耦合

设计模式的七大原则

设计模式的原则:设计“设计模式”时,遵守的原则,这样设计的依据

〇、设计模式核心思想

  • 找出应用中可能需要变化之处,将其独立出来,不要和固定不变的代码混在一起
  • 针对接口编程,而不是针对实现接口编程
  • 为了交互对象之间的松耦合设计而努力

一、单一职责原则

即一个类只负责一个职责,如有多个职责应分为多个类

  • 可以降低类的复杂性,一个类只负责一个职责
  • 提高类的可读性,可维护性
  • 降低变更引起的风险
  • 通常情况下,我们应当遵守单一职责原则。当类足够简单时,可以下放到方法上遵守单一职责原则

二、接口隔离原则

一个类对另一个类的依赖应当建立在最小接口上

如存在一个接口Interface1存在4个方法a()b()c()d(),它有一个实现类Impl1实现了它的四个方法。现存在类Class1需要使用接口中的b()c()方法,即Class1依赖与Interface1,使用uml类图表示如图

对于实现类Impl1来说,a()d()方法没有被使用,可以无需实现,却必须要书写。此时出现代码的冗余。根据接口隔离原则,可以将Interface1接口进行拆分

此时如果有另一个类需要使用b()c()d()三个方法时,需要将上图中的Interface2再拆分一次

至此,ClassAImplA的依赖,ClassBImplB的依赖,建立在最小接口上

三、依赖倒转原则

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转的中心思想:面向接口编程
  4. 依赖倒转原则的设计理念:相对于细节的多变性,抽象的东西要更为稳定。以抽象为基础搭建的架构比以细节为基础的架构更为稳定。
  5. 使用接口或抽象类的目的是制定好规范,将展示细节的任务交给他们的实现类去完成。

例1:打印出来源的信息

不遵守依赖倒转原则的写法

public class RawDependenceReversal {
    public static void main(String[] args) {
        Person p = new Person();
        p.receive(new Email());
    }
}

class Email{
    public String getInfo(){
        return "电子邮件信息";
    }
}

class Person{
    public void receive(Email e){
        System.out.println(e.getInfo());
    }
}

此时,若Person类可以接收的来源不只是Email,还需要添加其他来源时,会比较麻烦。

遵守依赖倒转原则进行改进:

public class ImproveDependenceReversal {
    public static void main(String[] args) {
        Persons p = new Persons();
        p.receive(new Emails());
        p.receive(new WeChat());
    }
}

interface Sender{
    public String getInfo();
}

class Emails implements Sender{
    @Override
    public String getInfo(){
        return "电子邮件信息";
    }
}

class WeChat implements Sender{
    @Override
    public String getInfo() {
        return "微信信息";
    }
}

class Persons{
    public void receive(Sender e){
        System.out.println(e.getInfo());
    }
}

依赖倒转的使用方式示例\

方式1:使用接口方式来进行依赖(调用方法时使用接口作为参数)。此时,依赖的是接口而不是细节类,因此符合依赖倒转原则

interface IOpenAndClose{
    void open(ITV tv);
}

class OpenAndClose implements IOpenAndClose{
    @Override
    public void open(ITV tv) {
        tv.play();
    }
}

interface ITV{
    void play();
}

方式2:通过构造方法来进行依赖

interface IOpenAndClose{
    void open();
}
interface ITV{
    void play();
}
class OpenAndClose implements IOpenAndClose{
    public ITV tv;
    public OpenAndClose(ITV tv){
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

方式3:通过setter方法来进行依赖

interface IOpenAndClose{
    void open();
    public void setTv(ITV tv);
}
interface ITV{
    void play();
}
class OpenAndClose implements IOpenAndClose{
    private ITV tv;

    @Override
    public void open() {
        this.tv.play();
    }

    @Override
    public void setTv(ITV tv) {
        this.tv = tv;
    }
}

注意事项和细节

  • 低层模块尽量都要有其对应的高层抽象类或接口,稳定性更好
  • 变量的声明尽量是抽象类或接口,使变量和实际对象之间添加一层缓冲,利于扩展和优化
  • 继承时遵循里氏替换原则

四、里氏替换原则

  • 所有引用基类的地方必须能够透明的使用其子类的对象。
  • 使用继承时,子类尽量不重写父类方法。
  • 继承实际上提升了类的耦合性。在适当的情况下,可以使用聚合、组合、依赖来解决问题

五、开闭原则

  • 模块和方法应该对扩展(提供方)开放,对修改(使用方)关闭。用抽象构建框架,用实现扩展细节
  • 软件需要变化时,尽量通过扩展实体的方式来实现变化,而不是通过修改现有的代码来实现庇阿变化
  • 其他原则及使用设计模式的目的是遵守开闭原则

六、迪米特法则

  • 一个对象应该对其他对象保持最小的了解。
  • 迪米特法则又称为最小知道原则。一个类对于其依赖的类,不管它多么复杂,都只关心其提供的public方法。
  • 迪米特法则就是只与直接的朋友通信
  • 直接的朋友:出现在成员变量、方法参数、方法返回值的类称为直接的朋友,出现在局部变量(方法内部的变量)的类不是直接的朋友。

七、合成复用原则

  • 尽量使用合成/聚合的关系,而不是使用继承

设计模式分类

23种分为三大类

  • 创建型模式

    单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式

  • 结构型模式

    适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

  • 行为型模式

    模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式

(0)

相关推荐

  • 如何学习23种设计模式及其思想?

    感觉设计模式是看着简单 ,但是一用就不会,23种设计模式,学的人头大,相信大家都是这样的 设计模式在程序员的面试中会被考到,通常是介绍其原理并说出优缺点.或者对比几个比较相似的模式的异同点.在笔试中可 ...

  • 通俗易懂系列 | 设计模式(三):适配器模式

    今天看了部特工电影,里面有个桥段,主角在直升机上和反派生死搏斗,而飞机则是无人驾驶的状态,有坠毁的危险.生死存亡,危急时刻主角让团队成员去驾驶,而团队成员很慌张地说:"Hey, man,你开 ...

  • Java设计模式之003--工厂模式

    工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一. 这种类型的设计模式属于创建型模式, 它提供了一种创建对象的最佳方式. 在工厂模式中, 我们在创建对象时不会对客户端暴 ...

  • 设计模式——六大设计原则

    文章目录 一.单一职责原则 二.里式替换原则 三.依赖倒置原则 四.接口隔离原则 五.迪米特法则 六.开闭原则 一.单一职责原则 单一职责原则简称 SRP,他想表达的就是字面意思,一个类只承担一个职责 ...

  • 结构型设计模式 -- 适配器模式

    一.小案例分析 1.功能需求: 以电源适配器为例. 一个人去外国旅游,住在外国某宾馆,恰好手机没电(手机是双孔插头),但外国宾馆只有三孔插座,宾馆一般不可能为了旅客,将三孔插座换成双孔插座,此时适配器 ...

  • 23种设计模式入门 -- 单例模式

    单例模式:采用一定的方法,使得软件运行中,对于某个类只能存在一个实例对象,并且该类只能提供一个取得实例的方法. 分类: 饿汉式 静态常量方式 静态代码块方式 懒汉式 普通方式,线程不安全 同步方法方式 ...

  • 设计模式系列之一:23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  • 有点污,23 种设计模式的通俗解释

    有点污,23 种设计模式的通俗解释

  • 23种设计模式全解析

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  • 面向对象23种设计模式系列(一)- 创建型设计模式

    本章是面向对象23种设计模式系列开篇,首先我们来看下什么是设计模式? 面向对象23种设计模式: 1.面向对象语言开发过程中,遇到的种种场景和问题,提出了解决方案和思路,沉淀下来就变成了设计模式. 2. ...

  • 设计模式系列之二:23种GoF设计模式的分类

    GoF设计模式一共有23个.一般可以按目的和作用范围来进行划分,具体划分方法如下:第一,这些模式按目的(即完成什么样任务)来划分为创建型.结构型和行为型这三种模式:创建型:用来创建对象.单例.原型.抽 ...

  • 23种设计模式之原型模式

    原型模式 1.基本介绍 1)原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象. 2)原型模式是一种创建型设计模式,允许一个对象再创建另一个可定制的 ...

  • 细谈八种架构设计模式及其优缺点概述

    作者:风平浪静如马 一.什么是架构 我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果.哈哈,我理解,架构就是骨架,如下图所示: 人类的身体的支撑是主要由骨架来承担的,然后是其上 ...