)
教程知识库【免费下载链接】tech-interview-for-developer 신입 개발자 전공 지식 기술 면접 백과사전 项目地址https://gitcode.com/GitHub_Trending/te/tech-interview-for-developer点击查看免费下载设计模式Design Pattern是软件工程中一套可复用的设计手法与设计方法其核心目标是保障软件的可重用性Reusability、兼容性Compatibility与可维护性Maintainability。本文以 Design Pattern/[Design Pattern] Overview.md 为骨架结合本仓库tech-interview-for-developer面向新入行开发者的技术面试百科中 Design Pattern 目录下的多篇实战文档与 Java 示例代码系统讲解设计模式的定义、SOLID 设计原则以及创建/结构/行为三大分类的判读方法。读完本文你将能够准确回答设计模式是什么、为什么用、有哪些原则、如何按目的分类这一组高频面试问题并能对照仓库中的源码示例快速识别每个模式属于哪一类。1. 设计模式的定义是设计手法而不是具体实现在仓库的Design Pattern/[Design Pattern] Overview.md中设计模式被明确界定为일종의 설계 기법이며, 설계 방법이다.一种设计技法一种设计方法。这一界定有两点关键含义设计模式是想法/方案아이디어而不是特定的代码实现。同一个模式在不同语言、不同业务场景下可以有完全不同的落地代码但其背后的结构思想是一致的。设计模式不是强制规范。项目并不需要处处套用模式它是为了预防日后在重用、兼容、维护阶段可能出现的问题而预先沉淀出的通用解法。换言之模式的价值在于问题发生之前的结构性预防而非问题发生之后的修补。这一点在本仓库的落地文档中有充分体现例如 Singleton Pattern.md 在 Java 中给出了 3 种不同实现synchronized 懒加载、双重检查锁、holder 静态内部类它们都是同一个单例思想的不同实现方式Adapter Pattern.md 和 Design Pattern_Adapter.md 则分别用鸭子/火鸡与MP3/MP4 媒体格式两套完全不同的例子演示了同一个适配器思想。这正印证了模式是想法、不是实现的核心论断。2. 设计模式的目标三大质量属性原文档将设计模式的目的浓缩为三个关键词目标韩文原文含义可重用性재사용성已有组件可以在新场景中复用而不是重复造轮子兼容性호환성组件之间、新旧接口之间可以协同工作可维护性유지 보수성修改、扩展、排查问题时的成本可控设计模式正是通过约束对象如何创建、对象之间如何组织关系、对象如何交互来同时保障这三者。这一点与仓库 SOLID.md 开篇对Design Smells设计坏味道的剖析互为表里Rigidity改一处牵全身、Fragility改无关代码却引发故障、Immobility难以拆出可复用组件、Viscosity宁加补丁也不维护设计——这些坏味道的本质恰恰是上面三大目标被破坏后的症状而设计模式与设计原则正是它们的解药。3. 设计原则基石SOLID객체지향 설계 원칙原文档指出设计模式的理论根基是SOLID 面向对象设计原则。这里完整继承原文档的要点并结合仓库 SOLID.md 中的示例逐条展开。3.1 Single Responsibility PrincipleSRP——单一职责原则하나의 클래스는 하나의 역할만 해야 함.一个类只承担一个职责。完整表述为A class should have one, and only one, reason to change——一个类只能有一个被修改的理由。仓库 SOLID.md 用一个Register注册类与Student学生类的例子说明若为了给 Student 增加排序功能而牵连了 Register 类就构成 SRP 违反正确做法是为每种排序方式单独创建类由 Client 按需调用让无关类免受牵连。SRP 与**内聚性Cohesion**高度相关——职责相近的成员聚合在一起正是内聚的直接体现。3.2 Open-Closed PrincipleOCP——开闭原则확장(상속)에는 열려있고, 수정에는 닫혀 있어야 함.对扩展/继承开放对修改封闭。完整表述为Software entities should be open for extension but closed for modification。仓库 SOLID.md 给出了一个反面 Java 示例——incAll()中用if/else按empType分派加薪逻辑void incAll(Employee[] emps) { for (int i0; iemps.size(); i) { if(emps[i].empType FACULTY) incFacultySalary((FACULTY)emps[i]) else if(emps[i].empType STAFF) incStaffSalary((STAFF)emps[i]) else if(emps[i].empType SECRETARY) incSecretarySalary((SECRETARY)emps[i]) } }这种写法同时诱发两种坏味道新增员工类型时必须不断改代码Rigid大量分支使代码难以定位Fragile。符合 OCP 的做法是通过抽象基类/接口让新增类型以扩展的方式加入核心流程代码保持不动。3.3 Liskov Substitution PrincipleLSP——里氏替换原则자식이 부모의 자리에 항상 교체될 수 있어야 함.子类必须能随时替换父类的位置。完整表述为Subtypes must be substitutable for their base types。仓库 SOLID.md 用 Java 标准库举了一个反例将java.util.Date替换为其子类java.sql.Time后调用getDate()会抛出IllegalArgumentException说明该继承关系破坏了 LSP。文档进一步提醒当需要复用某个 List 实现时应优先考虑对象组合object composition而非继承inheritance——比如让 Queue 继承 List 就会违反 LSP。这一点与仓库 Java 文档.md) 中组合优于继承的思想一脉相承。3.4 Interface Segregation PrincipleISP——接口隔离原则인터페이스가 잘 분리되어서, 클래스가 꼭 필요한 인터페이스만 구현하도록 해야 함.接口应当良好拆分让类只实现自己真正需要的接口。完整表述为Clients should not be forced to depend on methods they do not use。仓库 SOLID.md 的例子中Roast 应用只用到getName()、getSSN()而 Account 应用只用到getInvoice()、postPayment()——若把它们塞进同一个臃肿接口两边都会被迫依赖用不到的方法。解法是按客户端语义拆分为多个窄接口各取所需。3.5 Dependency Inversion PrincipleDIP——依赖倒置原则상위 모듈이 하위 모듈에 의존하면 안됨. 둘 다 추상화에 의존하며, 추상화는 세부 사항에 의존하면 안됨.高层模块不应依赖低层模块两者都应依赖抽象抽象不应依赖细节。完整表述为High-level modules should not depend on low-level modules. Both should depend on abstractions。仓库 SOLID.md 用 Program → Module → Function 的依赖图演示了倒置的含义将具体 Module 改为接口后依赖方向发生反转Inversion。需要留意的是DIP 倒置的不仅是依赖方向还包括所有权的倒置——高层模块通过抽象反过来约束低层模块必须提供的能力。记忆提示面试高频SRP 管类的职责OCP 管扩展与修改LSP 管继承关系ISP 管接口拆分DIP 管依赖方向。五个原则共同回答了类该怎么设计这一根本问题。4. 设计模式的三大分类본문의 핵심原文档强调3가지 패턴의 목적을 이해하기!务必理解三种模式的目的这是判断一个模式属于哪一类的关键。下面完整继承原文档的分类框架并逐一引入仓库中的对应实战文档作为佐证。4.1 创建型模式Creational——决定对象的创建方式关注点객체의생성 방식결정决定对象的创建方式。两个子类型Class-creational patterns类创建型侧重继承、Object-creational patterns对象创建型侧重组合。原文档给出的典型场景예) DBConnection을 관리하는 Instance를 하나만 만들 수 있도록 제한하여, 불필요한 연결을 막음. 例如将管理 DBConnection 的实例限制为仅创建唯一一个从而阻止不必要的连接。这正是**单例模式Singleton**的典型应用——数据库连接池、线程池、缓存、日志对象等公共资源只应存在一份实例。仓库佐证Singleton Pattern.md 完整给出了 Java 下单例的三种线程安全实现Lazy Initializationprivate static实例 private构造器 synchronized getInstance()——线程安全但每次调用都有同步开销性能差不推荐Lazy Initialization Double-checked Lockingvolatile static实例 双重判空 synchronized(Class)——仅在首次创建时加锁缓解了性能问题但并非完美方案Initialization on demand holder idiom利用 JVM 类加载机制将static final INSTANCE放在私有静态内部类LazyHolder中由 JVM 保证初始化原子性——实际工程中最常用的单例写法。仓库还特别指出单例的代价若单例承担过多职责或共享过多数据会导致类间耦合度升高从而违背开闭原则OCP使维护与测试变难多线程下不加同步还会产生多个实例。因此非必要不用单例。同属创建型的模式仓库中的 Design Pattern_Factory Method.md 演示了工厂方法模式Factory Method——把创建对象的部分交给子类RobotFactory抽象类声明abstract Robot createRobot(String name)SuperRobotFactory根据传入的namesuper/power返回不同的 Robot 子类实例。其本质同样是控制对象的创建方式。4.2 结构型模式Structural——组织对象之间的关系关注点객체간의관계를 조직组织对象之间的关系。原文档给出的典型场景예) 2개의 인터페이스가 서로 호환이 되지 않을 때, 둘을 연결해주기 위해서 새로운 클래스를 만들어서 연결시킬 수 있도록 함. 例如当两个接口互不兼容时新建一个类将二者连接起来。这正是**适配器模式Adapter**的典型应用——用一个转换类把客户端的期望接口与现有类的实际接口桥接起来。仓库佐证Adapter Pattern.md 给出了完整可运行的 Java 代码Duck接口quack()/fly()与Turkey接口gobble()/fly()互不兼容TurkeyAdapter implements Duck内部持有Turkey把quack()转译为turkey.gobble()使客户端可以像使用鸭子一样使用火鸡——这就是接口转换器的角色。Design Pattern_Adapter.md 用更贴近日常的例子演示同一思想MP3实现了MediaPlayer.play()而MP4只能playFile()新建FormatAdapter implements MediaPlayer在其play()内部转调media.playFile()于是player new FormatAdapter(new MP4()); player.play(file.mp4)即可无缝播放。Composite Pattern.md 则展示了结构型中另一个重要模式——组合模式通过Component抽象类统一叶子Leaf与容器Composite让客户端以一致接口处理对象层级树文档还对比了Transparency把 add/remove 声明在 Component 上与Safety把 add/remove 声明在 Composite 上两种取舍并指出它与 Decorator递归组合但目标是追加职责、Iterator顺序访问聚合对象的关系。注意适配器模式的使用方式在原文档中被标注为상속继承即通过新建子类/实现类完成转译其核心收益是——即使日后接口发生变化变更也被封装在适配器内部客户端无需改动。4.3 行为型模式Behavioral——组织、管理、联合对象的行为关注点객체의행위를 조직, 관리, 연합组织、管理、联合对象的行为。原文档给出的典型场景예) 하위 클래스에서 구현해야 하는 함수 및 알고리즘들을 미리 선언하여, 상속시 이를 필수로 구현하도록 함. 例如预先声明子类必须实现的函数与算法继承时强制其完成实现。这正是**模板方法模式Template Method**的典型应用——父类固化算法骨架把可变的步骤声明为抽象方法交给子类填充。仓库佐证行为型是仓库中示例最丰富的一类模板方法模式Template Method Pattern.md 用피자 만들기做披萨演示Pizza抽象类将반죽(和面) → 토핑(加料) → 굽기(烘焙)三步封装进final void makePizza()子类不可修改其中토핑()是abstract由PotatoPizza/TomatoPizza各自实现Design Pattern_Template Method.md 用建房HouseTemplate.buildHouse()给出同构示例并总结了优点核心逻辑管理容易、支持对象扩展与缺点抽象方法过多会令类管理复杂。实现该模式的三条铁律类用abstract、骨架方法用final禁止修改、各步骤用protected仅向子类开放。观察者模式Observer pattern.md 用잡지사:구독자杂志社:订阅者解释 1:N 的发布-订阅关系Publisher接口管理 Observer 的add/delete/notifyObserverNewsMachine实现发布者AnnualSubscriber/EventSubscriber实现订阅者——状态变化时自动向所有订阅者推送更新且通过接口保持松散耦合느슨한 결합。文档还提示Android 的OnClickListener、Java 内置的Observer/Observable都是观察者模式的应用后者因是类、需继承限制了再继承能力。策略模式Strategy Pattern.md 用슈팅 게임射击游戏演示战斗机射直线导弹、直升机射追踪导弹、只有战斗机有炸弹。解法是把可变的行为抽成ShootAction/BombAction接口并用类分别实现Unit抽象类持有这些接口变量Fighter构造时装配new OneWayMissle()、new SpreadBomb()——行为被封装为独立对象可整体替换这正是行为型的组织行为思想。同时它也是组合优于继承避免源码无谓重复的典型范例。5. 三大分类速查如何一眼判类分类核心问题判读口诀本仓库对应文档创建型 Creational对象如何被创建想控制 new 的过程Singleton Pattern.md、Design Pattern_Factory Method.md结构型 Structural对象之间如何组织关系想桥接、包装、组合结构Adapter Pattern.md、Design Pattern_Adapter.md、Composite Pattern.md行为型 Behavioral对象如何交互与分工想管理算法、通知、职责流转Observer pattern.md、Strategy Pattern.md、Template Method Pattern.md、Design Pattern_Template Method.md实际面试或设计中可这样判断凡涉及限制/控制实例的产生多半是创建型凡涉及让两个不兼容的接口协同、把结构组织成树多半是结构型凡涉及定义算法骨架、定义对象间通知/委托/职责链多半是行为型。6. 面试与实战建议结合本仓库기술 면접 백과사전技术面试百科的定位这一主题在面试中的考察方式通常有三层概念层能一句话说出设计模式是设计技法/想法目标是可重用、兼容、可维护原则层能默写 SOLID 五原则的中文或韩文表述并各举一个正面/反面例子可复用 SOLID.md 中的 Java 示例分类层能准确说出三大分类的目的并各举典型模式——创建型举单例/工厂方法结构型举适配器/组合行为型举观察者/策略/模板方法并指出每个模式解决的具体问题。建议对照仓库中的 Java 源码实际编译运行一遍TurkeyAdapter的鸭子测试Adapter Pattern.md、三种线程安全单例Singleton Pattern.md、NewsMachine的发布-订阅Observer pattern.md都是可以直接复制的完整示例。将概念 原则 分类 代码佐证四者打通即可在面试中给出有深度、有依据的回答。本文小结设计模式是保障软件可重用性、兼容性、可维护性的设计技法其理论基石是 SOLID 五原则其应用按目的分为创建型管对象的创建、结构型管对象的关系、行为型管对象的行为三大类。判断一个模式属于哪一类永远回到它的目的这一原点上。赞分享教程知识库【免费下载链接】tech-interview-for-developer 신입 개발자 전공 지식 기술 면접 백과사전 项目地址https://gitcode.com/GitHub_Trending/te/tech-interview-for-developer点击查看免费下载相关推荐klogg快捷键大全像Vim一样高效操作的完整清单klogg快捷键大全像Vim一样高效操作的完整清单 klogg是一款基于glogg项目开发的超快速日志查看器它不仅提供了强大的日志分析功能还支持类Vim的桌面应用开发工具面向对象编程原则Ready-For-Tech-Interview中的Java设计模式实践面向对象编程原则Ready For Tech Interview中的Java设计模式实践 面向对象编程 OOP 是Java语言的核心思想也是Ready Fo文档知识库教程图说设计模式之设计原则SOLID原则的图形化解释图说设计模式之设计原则SOLID原则的图形化解释 你是否在代码维护时遇到过修改一个功能引发多处bug是否在扩展系统时发现原有架构难以适配新需求本文通过项目文档教程上一篇Coolify状态管理应用状态持久化下一篇starship缓存策略LRU算法实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考