深入浅出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日

相关文章

  • asp.net SqlParameter如何根据条件有选择的添加参数

    在ASP.NET中,SqlParameter是用于向SQL语句中添加参数的类。有时候,我们需要根据条件有选择地添加参数。本文将介绍如何使用SqlParameter根据条件有选择地添加参数。 根据条件有选择地添加参数 在使用SqlParameter时,可以使用if语句或三元运算符等条件语句来判断是否需要添加参数。以下是示例: string sql = &quo…

    C# 2023年5月15日
    00
  • asp.net(c#) RSS功能实现代码

    ASP.NET(C#)中实现RSS功能一般可分为以下步骤: 第一步:准备数据 RSS需要的数据格式一般是XML,所以我们需要准备好相应的XML数据。在ASP.NET中可以使用Linq to XML技术来生成XML,下面是一个示例代码: XElement rss = new XElement("rss", new XAttribute(&q…

    C# 2023年5月31日
    00
  • 精简高效的C#网站优化经验技巧总结

    精简高效的C#网站优化经验技巧总结 1. 压缩响应数据 压缩响应数据是提高C#网站性能的常用技巧。可以使用Gzip压缩算法来减小响应数据的大小。在IIS上,开启静态压缩和动态压缩可以提高网站的响应速度。代码示例如下: using System.IO.Compression; protected void Application_PreRequestHandl…

    C# 2023年5月15日
    00
  • C#中函数的创建和闭包的理解

    C#中函数的创建和闭包的理解 函数创建 声明函数 在C#中使用function关键字来声明一个函数,语法格式为: visibility return_type function_name(parameter_list) { // function body } visibility:可见性修饰符,指定函数的访问范围,可以是public、private、pro…

    C# 2023年5月14日
    00
  • C# GUID ToString的使用总结

    C# GUID ToString的使用总结 什么是GUID GUID (Globally Unique Identifier) 是一个128位数的二进制标识符,通常用于在各种领域标识唯一性。 在C#中,可以使用Guid结构体来表示GUID。Guid结构体包含了许多静态方法和实例方法,其中一种实例方法是ToString。 怎么使用GUID ToString方法…

    C# 2023年6月7日
    00
  • 基于.net的分布式系统限流组件示例详解

    让我们来详细讲解一下关于“基于.net的分布式系统限流组件示例详解”的完整攻略。 1. 什么是分布式系统限流? 在一个分布式系统中,由于不同的模块可能会同时发起大量请求,对于一个稳定的服务而言,需要对这些请求进行限制,以避免系统过载导致的服务不可用或响应变慢情况。这个过程就被称为分布式系统限流。 2. 基于.net的分布式系统限流组件 本篇攻略介绍的是基于.…

    C# 2023年6月6日
    00
  • C# Path.GetExtension(string path):获取指定路径的文件扩展名

    C#的Path.GetExtension(string path)方法 Path.GetExtension(string path)方法是C#中的一个静态方法,用于获取给定路径(或文件名)的扩展名部分。扩展名是指路径字符串中最后一个点号 . 之后的文本,如果没有点号,则返回空字符串。 例如,对于路径”C:\myfile.txt”,GetExtension方法…

    C# 2023年4月19日
    00
  • C#控制台程序中使用官方依赖注入的实现

    下面是关于“C#控制台程序中使用官方依赖注入的实现”的完整攻略,包含两个示例。 1. 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件之间的依赖关系。在依赖注入中,组件不再负责创建它所依赖的对象,而是将这个责任交给外部容器。这样可以使组件更加灵活、可测试和可维护。 2. 使用官方依赖注入 在.NET …

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