披露:本文包含合作伙伴链接;如果您通过本文中的链接购买产品或服务,我可能会因此获得一些报酬。
大家好,听说要成为高级软件工程师,设计模式是需要学习的技能之一,因为这在高级软件工程师的面试中经常被考察。
虽然我一开始是因为其他原因学习的,但后来通过实践发现,设计模式对于编写能在生产环境中稳定运行的整洁代码是多么重要。
对于那些不太了解的人来说,设计模式是软件开发中常见问题的可重用解决方案。
它们总结了最佳做法,并提供了一个创建灵活、易于维护且可扩展软件的指南。
在最近的几篇文章中,我分享了许多热门的系统设计问题,比如API网关与负载均衡器的对比 和水平扩展与垂直扩展的对比,正向代理与反向代理的对比 以及50个系统设计面试问题,今天我将分享10个编程面试中常用的设计模式。
顺便说一下,如果你还没读过那些文章,也可以去读一读,特别是如果你想学系统设计,这对高级软件工程师来说也很有用。另一种很吃香的技能。
如果你正在为面试准备而学习这些概念,我建议你也可以看看ByteByteGo,DesignGurus.io,Exponent,Educative,Codemia.io,InterviewReddy.io 和 Udemy,这些网站提供了很多优质的系统设计课程。
P.S. 请一直读到最后。我给你准备了一个小惊喜。
编程面试中常见的10个面向对象设计模式所以,这里有你可以为编程面试学习的10个重要设计模式。虽然读这篇文章不需要太多时间,但如果想动手试试代码示例,可能会花上超过10分钟。不过,10分钟已经足够理解这些代码示例了。
1. 单例模式
单例模式确保一个类只能有一个实例,并提供全局访问该实例的途径。这在需要在整个系统中协调操作时特别有用,此时只需要一个对象。
下面是一个单例模式的代码示例。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
全屏:开,关
影响
此模式确保了对特定资源的单一控制点,避免不必要的实例创建,从而确保了资源的有效利用。
尽管许多人认为单例模式是反模式,因为它较难单元测试,而且更偏好依赖注入,单例模式仍然值得了解。
这是单例模式的UML图示
……此处省略若干文字……
二.设计模式之二:工厂方法模式
工厂方法模式定义了一个创建对象的接口,让子类可以改变要创建的具体对象类型。
它提供了一个接口来创建类的实例对象,由其子类来决定实例化为哪个具体的类。
这是这个模式的代码示例
public interface Product {
void 创建();
}
public class ConcreteProduct implements Product {
@Override
public void 创建() {
// 实现代码
}
}
public interface Creator {
Product 工厂方法();
}
public class ConcreteCreator implements Creator {
@Override
public Product 工厂方法() {
return new ConcreteProduct();
}
}
进入全屏,退出全屏
影响效果
此设计模式通过允许客户端代码通过接口与对象交互,促进松耦合,从而更容易扩展和维护。
下面是工厂方法模式的UML图:
……
3. 观察者模式
观察者模式定义了对象之间的一个对象与其他多个对象之间的依赖关系,使得当一个对象的状态发生变化时,所有依赖它的对象都会自动接收到更新的通知。
这在实现分布式事件处理系统时很常用。
例如:
public interface Observer {
void update(String message);
}
public class ConcreteObserver implements Observer {
@Override
public void update(String message) {
// 实现代码
}
}
public class Subject {
private List<Observer> 观察者列表 = new ArrayList<>();
public void 添加观察者(Observer 观察者) {
观察者列表.add(观察者);
}
public void 通知观察者(String message) {
for (Observer 观察者 : 观察者列表) {
观察者.update(message);
}
}
}
进入全屏 退出全屏
效应
这种设计模式让主体和观察者之间保持清晰分离,从而方便扩展和维护。
下面是一个观察者模式的UML图:
![观察者设计模式]( https://imgapi.imooc.com/676cb2550962ef0205000207.jpg) (观察者设计模式的示意图)
星号星号星号 (xīng hào xīng hào xīng hào)
4. 策略模式
策略模式定义了一组算法,并将每一个算法封装,使得这些算法可以互换。它让客户可以在运行时选择合适的算法。
以下是该模式的代码示例:
public interface PaymentStrategy {
void pay(int amount);
}
public class CreditCardPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
// 实现支付逻辑
}
}
public class PayPalPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
// 实现支付逻辑
}
}
public class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(int amount) {
// 结账金额
paymentStrategy.pay(amount);
}
}
全屏模式, 退出全屏
影响
这种设计模式使算法能够独立于使用它们的客户端变化,这有助于提高灵活性并方便替换算法。
这是Java中的策略设计模式(Strategy模式)的UML图如下所示:
添加了图片以解释 Java 中的策略设计模式
……
5. 装饰器模式
装饰器模式动态地为对象增加额外功能。装饰器为扩展功能提供了一种比继承更灵活的替代方案。
比如:
public interface Component {
void operation();
}
public class ConcreteComponent implements Component {
@Override
public void operation() {
// 实现功能
}
}
public abstract class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
public class 具体装饰者 extends Decorator {
public 具体装饰者(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
// 添加的功能
}
}
开启全屏 关闭全屏
作用
这种模式可以为对象动态添加职责,这样就能避免大量子类的需要。
这是装饰设计模式的UML图。
此处省略
6. 适配器模式
适配器模式使不兼容的接口能够协同工作。它在两个不兼容的接口之间充当桥梁,使它们能够协同工作而不需修改它们的代码。
这里是一个Java中适配器模式的代码示例
public interface 目标接口 {
void 请求();
}
public class 适配者类 {
public void 特定请求() {
// 实现
}
}
public class 适配器 implements 目标接口 {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void 请求() {
adaptee.specificRequest();
}
}
全屏(开启/关闭)
影响
这种方法让现有的系统能一起工作,即使接口不兼容,帮助这些系统更好地集成。
这里展示的是Java中适配器模式的UML图示:
7. 命令模式(Command Pattern)
命令模式将请求封装在一个对象中,从而使得不同的请求能够对客户端进行参数化配置,允许请求的排队处理和记录请求参数。
这是该模式的一个代码示例:
public interface 指令 {
void 执行();
}
public class 具体指令 implements 指令 {
private 接收者 receiver;
public 具体指令(接收者 receiver) {
this.receiver = receiver;
}
@Override
public void 执行() {
receiver.动作();
}
}
public class 接收者 {
public void 动作() {
// 实现代码
}
}
public class 调用者 {
private 指令 command;
public void 设置指令(指令 command) {
this.command = command;
}
public void 执行指令() {
command.执行();
}
}
全屏切换;退出全屏
影响
这种模式使请求的发送方和接收方之间保持松散耦合,从而使得命令处理更加灵活和易于扩展。
这里是Java中命令模式的UML图:
8 。组合模式
组合模式将对象组合成树形结构以表示部分与整体的层级关系。它允许客户端以相同的方式处理单个元素及其组合。
这里有一个Java实现组合模式的代码示例:
public interface Component {
void 运行();
}
public class Leaf implements Component {
@Override
public void 运行() {
// Implementation
}
}
public class Composite implements Component {
private List<Component> components = new ArrayList<>();
public void 添加部件(Component component) {
components.add(component);
}
@Override
public void 运行() {
for (Component component : components) {
component.运行();
}
}
}
点击这里可以进入全屏;点击这里可以退出全屏
影响方面
这种模式通过允许客户端代码统一处理单个对象以及它们的组合并简化操作,大大简化了客户端的代码处理。
以下为在Java中Composite模式的UML图。
9. 责任链模式
责任链模式将请求传递给一系列处理者。每个处理者决定要不要处理请求,还是将其传递给下一个处理者。
下面是一个代码样例:
public abstract class Handler {
private Handler 后继者;
public void setSuccessor(Handler 后继者) {
this.后继者 = 后继者;
}
public void handleRequest() {
if (后继者 != null) {
后继者.handleRequest();
}
}
}
public class ConcreteHandler extends Handler {
@Override
public void handleRequest() {
// 处理请求,并调用父类的方法继续处理
super.handleRequest();
}
}
全屏模式进入 / 全屏模式退出
影响方面
将发送者和接收者分离,让多个对象可以处理一个请求,发送者不必知道具体是哪个对象来处理请求。
下面展示的是Java中责任链模式(Chain of Responsibility)的UML图。
10. 状态模式
状态模式让对象在当内部状态发生变化时改变行为。对象看起来就像是换了一种类型。
下面是一个Java中状态设计模式的代码示例:
public interface State {
void handle();
}
public class ConcreteStateA implements State {
@Override
public void handle() {
// 这里是状态A的处理逻辑
}
}
public class ConcreteStateB implements State {
@Override
public void handle() {
// 这里是状态B的处理逻辑
}
}
public class Context {
private State currentState;
public void setState(State state) {
currentState = state;
}
public void request() {
// 当前状态的处理逻辑
currentState.handle();
}
}
切换到全屏模式,退出全屏
影响是
状态模式通过允许对象动态改变其内部状态来简化复杂的对象行为。
这是Java里状态设计模式的UML图:
最后的总结
这就是关于编程面试中必备的10个设计模式的所有内容。设计模式是开发人员工具箱中不可或缺的工具,为常见的软件设计挑战提供解决方案。
理解并应用这些模式可以显著提高代码的可维护性、扩展性和伸缩性。
虽然掌握这些模式可能需要一些时间,但谨慎地使用它们融入你的项目中,无疑会使你的软件架构更加稳健和灵活。
更多学习
- Java中的设计模式 了解Java中设计模式的实际实现。
- 软件架构基础课程 学习软件架构的基础概念。
- 掌握面向对象编程面试 通过实际案例准备面向对象编程面试。
- 免费的Java设计模式与架构指南 获取Java设计模式及其应用的免费指南。
- 设计模式库 一个丰富的设计模式示例库,包含详细的解释。
- 实例中的模式 通过具体实例学习模式,加深理解。
如承诺的那样,这是给你的奖励,一本免费的电子书。我刚刚发现了一本新的免费书籍,用来学习分布式系统设计会很好,你也可以在这里的微软官网上点击这里阅读。--- https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf
图片来源:twitter
共同学习,写下你的评论
评论加载中...
作者其他优质文章