深入浅出23种设计模式

深入浅出23种设计模式完整攻略

介绍

设计模式是指在软件设计中,为了解决特定问题而被反复使用的一种解决方案。23种设计模式包括创建型、结构型和行为型三种类型,每种类型包括若干个具体的设计模式。本文将详细讲解23种设计模式的原理、实现方法和具体应用场景,以及两个示例说明。

创建型模式

单例模式

单例模式保证一个类只有一个实例,并提供全局访问点。常用于资源访问、日志记录等场景。示例:一个日志记录器,在多线程的情况下也只有一个实例,所有调用此日志记录器的操作都会输出到同一个日志文件。

public class Logger {
    private static final Logger instance = new Logger();

    private Logger() {}

    public static Logger getInstance() {
        return instance;
    }

    public void log(String message) {
        // 记录日志
    }
}

抽象工厂模式

抽象工厂模式定义了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。示例:一个UI框架,包括多个不同风格的按钮、文本框等组件,可以提供不同风格的UI皮肤供用户选择。

public interface Button {
    void paint();
}

public interface TextField {
    void paint();
}

public interface UIFactory {
    Button createButton();
    TextField createTextField();
}

public class WindowsUIFactory implements UIFactory {
    public Button createButton() {
        return new WindowsButton();
    }
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

public class LinuxUIFactory implements UIFactory {
    public Button createButton() {
        return new LinuxButton();
    }
    public TextField createTextField() {
        return new LinuxTextField();
    }
}

结构型模式

适配器模式

适配器模式用于将不同接口的对象进行转换,以便能够让它们正常工作。示例:一个3.5mm的耳机需要插入到6.35mm的耳机插孔上,需要使用一个适配器将3.5mm接口转换为6.35mm接口。

public interface Target {
    void play();
}

public class Adaptee {
    void speak() {
        // 发出声音
    }
}

public class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();

    public void play() {
        adaptee.speak();
    }
}

外观模式

外观模式提供了一个高层接口,使得客户端能够更加方便地访问系统的内部功能。示例:一个多媒体播放器,可以播放音乐、视频等多种类型的文件,但客户端只需要调用一个播放方法即可,多媒体播放器会根据不同类型的文件自动选择不同的播放方式。

public interface Player {
    void play(String filename);
}

public class AudioPlayer implements Player {
    void play(String filename) {
        // 播放音频文件
    }
}

public class VideoPlayer implements Player {
    void play(String filename) {
        // 播放视频文件
    }
}

public class MediaPlayerFacade {
    private AudioPlayer audioPlayer = new AudioPlayer();
    private VideoPlayer videoPlayer = new VideoPlayer();

    public void play(String filename) {
        if (filename.endsWith(".mp3")) {
            audioPlayer.play(filename);
        } else if (filename.endsWith(".avi")) {
            videoPlayer.play(filename);
        }
    }
}

行为型模式

策略模式

策略模式定义了一系列算法,将它们封装起来,并使它们可以相互替换。示例:一个排序器,可以根据不同的排序算法进行排序,包括冒泡排序、快速排序等,客户端可以动态地切换不同的排序算法。

public interface Sorter {
    void sort(int[] data);
}

public class BubbleSorter implements Sorter {
    void sort(int[] data) {
        // 冒泡排序算法
    }
}

public class QuickSorter implements Sorter {
    void sort(int[] data) {
        // 快速排序算法
    }
}

public class SorterContext {
    private Sorter sorter;

    public SorterContext(Sorter sorter) {
        this.sorter = sorter;
    }

    public void sort(int[] data) {
        sorter.sort(data);
    }
}

观察者模式

观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都将得到通知并自动更新。示例:一个气象站,可以收集不同地区的温度、湿度等数据并进行适时通知。

public interface Observer {
    void update(float temperature, float humidity, float pressure);
}

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

public class WeatherData implements Subject {
    private float temperature;
    private float humidity;
    private float pressure;
    private List<Observer> observers = new ArrayList<>();

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature, humidity, pressure);
        }
    }

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObservers();
    }
}

总结

本文介绍了23种设计模式的原理、实现方法和具体应用场景,并通过两个示例说明了各种设计模式的具体使用方法。设计模式可以提高软件系统的可维护性、可扩展性和可重用性,是软件开发中非常实用的一种技术。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅出23种设计模式 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#对DataTable里数据排序的方法

    下面是关于C#对DataTable里数据排序的方法的完整攻略: 1. 使用DataView对象实现数据排序 步骤一:创建DataTable 首先,我们需要创建一个DataTable对象,作为数据源。下面是一个简单的示例: DataTable dt = new DataTable(); dt.Columns.Add("Name", type…

    C# 2023年6月7日
    00
  • 在 C# 中使用 Span 和 Memory 编写高性能代码的详细步骤

    在 C# 中,Span 和 Memory 是用于优化代码性能的关键类型。Span 是一种结构体类型,它将对象内存表示为连续的、可编辑的范围。Memory 则是一个类类型,可以包装一段内存以及操作该内存的方法。使用这两种类型,可以使代码更高效地使用内存和更快地执行。 下面介绍一些使用 Span 和 Memory 编写高性能代码的详细步骤。 步骤一:创建 Spa…

    C# 2023年6月3日
    00
  • .NETCore基于RabbitMQ实现延时队列的两方法

    以下是“.NETCore基于RabbitMQ实现延时队列的两方法”的完整攻略: 什么是延时队列 延时队列是一种特的消息队列,它可以在一时间后才将消息发送到消费者。延时队列通常用于实现定时任务、消息重试等功能。 基于RabbitMQ实现延时队列的两种方法 RabbitMQ是一种流行的消息队列系统,它支持延时队列。以下两种基于RabbitMQ实现延时队列的方法:…

    C# 2023年5月12日
    00
  • C# TextWriter.Flush – 刷新文本编写器

    C#中的TextWriter类是一个抽象类,它定义了一组用于向文本流进行写入的方法和属性。其中Flush方法是一个用于清空缓冲区的方法,该方法会将缓冲区的所有数据立即写入到流中,确保数据已经被完全输出。 Flush方法的使用方法 Flush方法的使用方法非常简单,只需要调用Flush方法即可。示例代码如下: using System; using Syste…

    C# 2023年4月19日
    00
  • .NET1.0版本中的异步编程模型(APM)

    .NET 1.0版本中的异步编程模型(APM) 在 .NET 1.0 版本中,使用异步编程模型(Async Programming Model,APM)可以轻松实现异步操作,其主要思想是通过非阻塞式编程模型来提高程序性能和响应时间。通过将耗时操作放入单独的线程中,并在处理完成后通知调用线程,提高了程序并发性和响应时间。 异步编程模型的基本组成部分 异步编程模…

    C# 2023年6月3日
    00
  • C#实现redis读写的方法

    下面是详细讲解 “C#实现redis读写的方法” 的完整攻略。 1. 确认redis环境 在进行redis读写之前,需要先确认redis环境已经搭建好,可以通过redis-cli工具进行连接并验证,确保redis的启动地址、端口号、用户名和密码等信息都正确无误。 2. 安装StackExchange.Redis包 C#中实现redis读写可以使用StackE…

    C# 2023年5月31日
    00
  • C# ManualResetEvent使用方法详解

    C# ManualResetEvent使用方法详解 ManualResetEvent是C#中的一个线程同步类,它可以在多线程场景下,实现线程等待和唤醒的功能。本文将详细讲解ManualResetEvent的使用方法。 ManualResetEvent简介 ManualResetEvent是一个线程同步类,用于在多线程环境下控制线程的等待和唤醒。它主要包含两个…

    C# 2023年5月15日
    00
  • 使用.NET Core创建exe应用程序

    使用.NET Core创建exe应用程序需要分为以下几步: 步骤1:安装.NET Core SDK 在开始创建应用程序之前,首先需要在本地计算机上安装.NET Core SDK(Software Development Kit)。可以访问 .NET Core SDK官网 根据自己的需要选择合适的.NET Core版本进行下载和安装。 步骤2:创建.NET C…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部