设计模式笔记

本文介绍了软件设计中的低耦合和高内聚原则,以及面向对象编程中的向上转型、向下转型、synchronized关键字的工作原理。还涉及Java枚举类、Runtime类的功能和开闭原则的应用示例。链式编程的特点也被提及,强调了连续调用方法的便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

d什么是低耦合高内聚

低耦合高内聚是软件设计的一个重要原则。
低耦合意味着:

  • 模块之间的依赖关系尽可能少。一个模块的变化不会影响其他模块。

  • 模块之间通过明确定义的接口进行通信,不会相互访问内部数据。

    高内聚意味着:

  • 模块内部功能强相关,实现了一个明确的单一功能。

  • 模块内部代码、数据高度集成,实现了该功能模块的完整逻辑。
    简单来说:

  • 低耦合指软件组件之间的依赖关系少。

  • 高内聚指软件组件内部代码和数据的集中性强,实现了明确的单一功能。
    这是一种良好的软件设计原则。它可以提高软件的可扩展性、可维护性和可靠性。通过低耦合和高内聚的设计,可以更好地实现模块的独立性和可复用性。

区分向下,向上转型 – 从等号右边看,把右边的值付给左边

向上转型和向下转型是面向对象编程中的两个重要概念:
向上转型例子:
假设有一个Animal类,然后有Cat和Dog两个子类继承Animal类。

Animal animal = new Cat(); 

这里我们把Cat对象赋值给Animal类型的变量,这就是向上转型。
向上转型的好处是可以把子类对象作为父类使用,扩大了对象的使用范围。
向下转型例子:

Cat cat = (Cat)animal;

这里我们把Animal类型变量强制转换为Cat类型,这就是向下转型。
向下转型前需要判断animal对象是否真的是Cat类型,否则会抛出ClassCastException异常。
向下转型的好处是可以调用子类特有的方法,但同时也增加了类型检查的复杂性。
总之:

  • 向上转型是把子类对象赋值给父类变量,扩大了对象的使用范围。
  • 向下转型是把父类变量强制转换为子类,以调用子类特有功能,但需要类型检查防止异常。
    它们在面向对象设计和编程中都很常见。

synchronized 的 原理是什么

synchronized关键字的原理主要有以下几点:

  1. 对象监视器(Object Monitor)
    每个Java对象都可以关联一个对象监视器。synchronized关键字就是通过对象监视器来完成同步的。
  2. 互斥锁
    对象监视器内部会维护一把锁,称为互斥锁。当线程获取了这个对象的锁,其他线程就无法获取这个对象的锁。
  3. 同步队列
    如果一个线程试图获取已经被其他线程锁住的对象的锁,会将该线程放入对象监视器的同步队列中进行等待。
  4. 同步进入/退出
    线程进入synchronized代码块或方法时,会先获取对应的对象锁。退出时会释放锁。
  5. 可重入锁
    同一个线程可以多次获取同一把锁。这对于递归调用很重要。
  6. 可中断锁
    锁可以响应线程中断,如果线程等待锁时被中断,会抛出InterruptedException。
  7. 锁优先级翻转
    如果一个高优先级线程等待低优先级线程释放锁,会导致优先级翻转,高优先级线程优先获得锁。
    所以synchronized的原理就是通过对象监视器维护一把互斥锁,实现同一时刻只有一个线程持有该锁,从而保证同步访问的线程安全性。

Java枚举类的定义和使用如下:

public enum Day {
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

枚举类里面的枚举值默认没有类型,它们本身就是一个个静态常量值。

Runtime类

所以总的来说,Runtime类提供了操作系统级别和JVM级别的运行时信息,可以用于监控JVM状态、优化内存使用、动态加载类、执行外部程序等高级功能。它给Java程序提供了一定的系统编程能力。

如何理解开闭原则

对扩展开放,对修改关闭。听起来很高级但是他们的本质很简单,其实就是换个地方添加代码

public class SimpleCoffeeFactory {
  public static Coffee createCoffee(String type) {
    Coffee coffee = null;
    if("americano".equals(type)) {
      coffee = new AmericanoCoffee();
   } else if("latte".equals(type)) {
      coffee = new LatteCoffee();
   }
    return coffe;
 }
}

就可以改成接口的形式

public interface CoffeeFactory {
  Coffee createCoffee();
}

然后再来具体的工厂的对象

public class LatteCoffeeFactory implements CoffeeFactory {
  public Coffee createCoffee() {
    return new LatteCoffee();
 }
}

这样我们就把黑体处要添加的代码移了出来,即要添加新的代码就变成了添加一个新的具体类来继承就行了,就不用该原来类的代码。这样就完成了代码的“移动”,形成了开闭原则

链式编程的特点是什么

链式编程的主要特点是:

  • 每个方法返回自身的实例对象,允许方法链接在一起调用。
  • 可以在一个语句中连续调用多个方法,而不需要在每个方法之间定义变量或临时变量。




此文章用于笔者记录学习,也希望对你有帮助

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值