设计模式第一回

一 UML

1.1 UML Class

1.1 子类指向父类

在这里插入图片描述

1.2 实现继承、虚线实现

在这里插入图片描述

在这里插入图片描述

1.3 实现关联,虚线依赖

在这里插入图片描述

在这里插入图片描述

虚线:
在这里插入图片描述

实线:
在这里插入图片描述

1.4 空心菱形-聚合 实心菱形-组合

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.5 案例

在这里插入图片描述

1.2 UML时序图

在这里插入图片描述

在这里插入图片描述

二 设计原则

设计原则:

  • 开闭原则

  • 依赖倒置原则

  • 单一职责原则

  • 接口隔离原则

  • 迪米特法则(最少知道原则)

  • 里氏替换原则

  • 合成、复用原则(组合、复用原则)

    2.1 开闭原则

    一个软件实体如类,模块或者函数应该对扩展开放,对修改关闭(开闭)。强调的是用抽象构建框架,用实现扩展细节。按照这个原则的优点就是提高软件的可复用性和可维护性。----面向抽象编程。

举例有个课程的设计,面向抽象编程首先课程定义成接口,课程有获取课程id,课程名称,课程价格的三个抽象方法

public interface ICourse {

    public Integer getId();
    public String getName();
    public Double getPrice();

}

针对课程,可能会有Java课程,Go课程,PHP课程等等,因此我们会有不同的子类实现

package designpatterns.principle.openclose;

public class JavaCourse  implements ICourse{

    private int id;
    private String name;
    private double price;

    public JavaCourse(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public Integer getId() {
        return this.id;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public Double getPrice() {
        return this.price;
    }
}
package designpatterns.principle.openclose;

public class GoCourse implements ICourse{

    private int id;
    private String name;
    private double price;

    public GoCourse(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public Integer getId() {
        return this.id;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public Double getPrice() {
        return this.price;
    }
}

在这里插入图片描述

我们编写一个测试类,来获取某个具体课程的名称,价格等:

package designpatterns.principle.openclose;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import static org.junit.Assert.*;

@Slf4j
public class ICourseTest {

    @Test
    public void testCourse() {

        ICourse iCourse = new JavaCourse(1001, "java 编程学习", 320);

        log.info("课程id {}, 课程名称{}, 课程价格{}", iCourse.getId(), iCourse.getName(), iCourse.getPrice());

    }
}

假如这时候这时候我们需要一个活动,比如双十一 618等等,这时候价格有一个打折的价格。那么应该怎么做?

一种方法我们通过修改接口,增加一个getDiscountPrice(), 但是接口一般是稳定的,不应该有大动作改动,这会带来一个问题,就是我们的所有这个接口的实例比如JavaCourse,GoCourse 都需要更改逻辑增加这样的一个方法,这就破坏了我们的开闭原则。那么我们还能怎么做呢?
定义一个新的子类,继承自JavaCourse,这时候我们就不需要改动Course接口,也不需要改动avaCourse,GoCourse,这样我们就做到了对扩展开放,对修改关闭。

package designpatterns.principle.openclose;

public class JavaDiscountCourse  extends JavaCourse{
    public JavaDiscountCourse(int id, String name, double price) {
        super(id, name, price);
    }


    public Double getOriginPrice() {
        return super.getPrice();
    }

    @Override
    public Double getPrice() {
        return super.getPrice() * 0.8;
    }
}

测试类调整如下:

package designpatterns.principle.openclose;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import static org.junit.Assert.*;

@Slf4j
public class ICourseTest {

    @Test
    public void testCourse() {

        ICourse iCourse = new JavaCourse(1001, "java 编程学习", 320);

        log.info("课程id {}, 课程名称{}, 课程价格{}", iCourse.getId(), iCourse.getName(), iCourse.getPrice());

    }

    @Test
    public void testCourseDiscount() {

        ICourse iCourse = new JavaDiscountCourse(1001, "java 编程学习", 320);

        JavaDiscountCourse javaDiscountCourse = (JavaDiscountCourse)iCourse;
        log.info("课程id {}, 课程名称{}, 原始课程价格{},打折之后的价格", iCourse.getId(), iCourse.getName(), ((JavaDiscountCourse) iCourse).getOriginPrice(), iCourse.getPrice());

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于Node.js设计模式第三版pdf,这是一本关于Node.js设计模式的书籍,适合想要深入了解Node.js的开发者和架构师阅读。 在这本书中,作者通过实例代码和详细解释,介绍了一些常见的设计模式,并提供了在Node.js环境下的应用实践。这些设计模式包括但不限于观察者模式、装饰器模式、工厂模式等等。通过学习这些设计模式,读者可以更好地组织和管理Node.js应用的代码和功能,提高代码的可读性、可维护性和可扩展性。 此外,本书还介绍了一些面向对象设计原则和开发实践,如单一职责原则、依赖倒置原则、模块化设计等,帮助读者理解如何在Node.js中进行良好的架构设计。同时,书中还提供了一些在实际项目中遇到的常见问题和解决方案,帮助读者更好地应对实际开发中的挑战。 总的来说,Node.js设计模式第三版pdf是一本深入学习和理解Node.js设计模式的实用书籍,对于提高Node.js应用的开发质量和技术水平具有很大的帮助。无论是初学者还是有一定经验的开发者,都可以从中获取到有用的知识和技巧。 ### 回答2: 《Node.js 设计模式 第三版》是由Mario Casciaro和Luciano Mammino合著的一本关于Node.js设计模式的书籍。这本书以深入浅出的方式介绍了Node.js中的常见设计模式,并提供了实际的示例代码和解决方案。 本书共分为四个部分。第一部分介绍了Node.js和设计模式的基础概念,以及如何选择适当的设计模式来解决问题。第二部分详细介绍了Node.js中常见的设计模式,包括单例模式、工厂模式、观察者模式、装饰器模式等等。每个模式都有详细的代码示例和解释,方便读者理解和实践。 第三部分讨论了如何组织和管理大型Node.js项目中的设计模式。作者介绍了常见的架构模式,如分层架构、微服务架构和事件驱动架构,并解释了如何使用设计模式来支持这些架构。读者可以学习如何将设计模式应用于实际项目中,提高代码的可维护性和可扩展性。 第四部分探讨了一些高级主题,如测试驱动开发、性能优化和安全性。作者分享了一些实用的技巧和建议,帮助读者更好地应用设计模式解决实际问题。 总体而言,这本书是一本非常实用的Node.js设计模式指南。通过学习这本书,读者可以了解Node.js中常见的设计模式,并学习如何应用这些模式来解决实际问题。无论是初学者还是有经验的开发人员都可以从中受益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值