23种设计模式详解(上)

简介: 23种设计模式详解(上)

开闭原则

对扩展开放,对修改关闭

例子

其中AbstractSkin抽象类,皮肤类:

package com.linghu.demo01;
/**
 * 抽象皮肤类
 * @author linghu
 * @date 2024/2/1 15:42
 */
public abstract class AbstractSkin {
    //展示皮肤的方法
    public abstract void display();
}

另外的DefaultSpecificSkinHeimaSpecificSkinSouGouInput三个是子类,不动这三个子类的情况下,自己新建皮肤类,然后在下面代码【2】处进行更改,实现良好的扩展性。

Test类如下:

package com.linghu.demo01;
/**
 * @author linghu
 * @date 2024/2/1 15:58
 */
public class Client {
    public static void main(String[] args) {
        //1、创建搜狗输入法对象
        SouGouInput input = new SouGouInput();
        //2、创建皮肤对象
        HeimaSpecificSkin skin = new HeimaSpecificSkin();
//        DefaultSpecificSkin skin = new DefaultSpecificSkin();
        //3、将皮肤设置到输入法中
        input.setSkin(skin);
        //4、显示皮肤
        input.display();
    }
}

总结

对扩展开放,对修改关闭的含义就是: 我们可以在定义扩展其他皮肤类【2】,只要在上述代码中新建对象即可。不需要修改原有的DefaultSpecificSkinHeimaSpecificSkinSouGouInput三个子类。

里氏代换原则

子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除了添加新的方法完成额外功能外,尽量不要重写父类的方法。

基本介绍

  • 里氏替换原则在1988年,有麻省理工学院的以为姓里的女士提出的。
  • 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得T1定义的所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。换句话说,所欲引用基类的地方必须能透明的使用其子类的对象。
  • 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。
  • 继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题

例子

为遵循里氏替换原则的后果:

package com.weirdo.principle.liskov;
public class Liskov {
    public static void main(String[] args) {
        A a = new A();
        System.out.println("11-3="+a.func1(11,3));
        System.err.println("==========================");
        B b = new B();
        //这里本意求11-3
        System.out.println("11-3="+b.func1(11,3));
        System.out.println("1-8="+b.func1(1,8));
        System.out.println("11+3+1="+b.func2(11,3));
    }
}
//A类
class A {
    //返回两个数的差
    public int func1(int num1, int num2) {
        return num1 - num2;
    }
}
//B类继承了A
//增加了一个新功能:完成两个数相加,然后和1求和
class B extends A {
    //这里,重写了A类的方法,可能是无意识
    public int func1(int a, int b) {
        return a + b;
    }
    public int func2(int a, int b) {
        return a + b + 1;
    }
}

依赖倒转原则

基本介绍

高层模块不应该依赖底层模块,两者都应该依赖其抽象;这里的抽象就是指:接口! 抽象不应该依赖细节,细节应该依赖抽象,简单地说就是要求对抽象(接口)进行编程,不要对实现进行编程,这样就降低了客户与实现模块之间的耦合。

例子

如下图所示,扩充的IntelCpu类没法更换成其他的CPU类,就很不方便

在这个Computer类中,如果我们要添加一个CPU的话,就要修改Computer类,这就会导致臃肿麻烦。违背了开闭原则!

接下来使用依赖倒转原则,就是把类抽取出接口:

如上做的好处就是,如果有其他品牌的CPU加入,我们只需要在实现类旁边进行扩充,去实现接口即可!

接口隔离原则

基本介绍

**客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。 **

例子

上面的代码设计如下图:

这种设计的缺陷在于,黑马品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一个传智品牌的安全门,而该安全门只具有防盗、防水功能呢?很显然如果实现SafetyDoor接口就违背了接口隔离原则,那么我们如何进行修改呢?看如下类图:

改进以后的代码:

package com.linghu.demo04.after;
/**
 * 新品牌门的加入
 * @author linghu
 * @date 2024/2/4 9:57
 */
public class NewDoor implements AntiTheft,Fireproof{
    @Override
    public void antiTheft() {
        System.out.println("防盗");
    }
    @Override
    public void fireproof() {
        System.out.println("防火");
    }
}

新品牌的门的加入就不会在影响之前的门的牌子类了。这就是接口隔离的好处。

迪米特法则

基本介绍

**其实就是类似于Java中的代理,或者直接点就是外包公司!。**主打的是一种办事情的流程,这种方便的流程。

为什么要找软件公司呢?这个外包公司可以帮助程序员和客户省去交流的成本,沟通的成本,提高效率!

24种设计模式详解(下)+https://developer.aliyun.com/article/1625050

目录
相关文章
|
5月前
|
设计模式 算法 Java
C++设计模式
C++设计模式
38 0
|
4月前
|
设计模式 开发框架 前端开发
设计模式一
设计模式是面向对象编程的实践经验,旨在解决一系列问题,促进软件的可升级和维护。它分为创建型(如工厂、单例模式)、结构型(适配器、装饰器模式等)和行为型(观察者、策略模式等)三大类。J2EE模式关注表示层,包括MVC模式等。设计模式的七大原则包括里氏替换、依赖倒置、开闭原则、单一职责、接口隔离、迪米特原则和合成复用原则,这些原则有助于减少耦合和提高代码可读性。接口作为契约和层间对接工具,约束类型行为并允许实现多继承。
|
5月前
|
设计模式 算法
什么是设计模式,有哪些设计模式,设计模式用来做什么
什么是设计模式,有哪些设计模式,设计模式用来做什么
|
5月前
|
设计模式 存储 安全
[设计模式] 常见的设计模式
[设计模式] 常见的设计模式
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36063 15
设计模式(C++版)
|
设计模式 关系型数据库
设计模式介绍
设计模式介绍
|
设计模式
纵观设计模式
前言: 设计模式已经学习了近一个月,但深知还没有学到设计模式的精髓,先将这一阶段的感受记录下来,以后加实例辅助学习。
纵观设计模式
|
设计模式
设计模式——里氏替换
设计模式——里氏替换
|
设计模式 XML 开发框架
设计模式的理解
设计模式的理解
设计模式的理解
|
设计模式 XML 存储