深入浅出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# 实现汉诺塔游戏

    C#实现汉诺塔游戏攻略 思路分析 在讲解C#实现汉诺塔游戏之前,我们先来了解一下它的思路。 汉诺塔游戏是一种经典的递归算法,基本思路如下: 假设有A、B、C三条柱子,A柱子上有n个不同大小的盘子,盘子大小由下到上依次变小,现在要求将A柱子上的盘子移动到C柱子上,移动过程中可以借助B柱子,但每次只能移动最上面的盘子,并且大盘子不能放在小盘子上面。 例如,当有三…

    C# 2023年5月15日
    00
  • 深入探讨C#中的结构struct

    深入探讨C#中的结构struct 在C#中,结构(struct)是一种值类型(value type),不同于引用类型(reference type)。结构可以用来表示较简单的数据结构,比如二维坐标(x,y),RGB颜色等等。 结构的定义 结构可以通过struct关键字来定义。例如定义一个二维的点的结构,代码如下: public struct Point2D …

    C# 2023年5月15日
    00
  • 使用Entity Framework(4.3.1版本)遇到的问题整理

    使用Entity Framework(4.3.1版本)遇到的问题整理 问题概述 Entity Framework(以下简称EF)是一个非常流行的ORM(Object Relational Mapper)框架,它能够将C#对象与关系型数据库进行映射。但是在使用EF的过程中,可能会遇到一些问题,本文将对这些问题进行整理和分析。 问题1:EF生成的SQL语句效率低…

    C# 2023年5月31日
    00
  • C#实现根据图片的链接地址获取图片的后缀名

    当我们给很多图片命名时,我们通常会使用图片的结尾部分作为图片的后缀名。因此,获取图片的后缀名是一项非常常见的任务。在C#中,我们可以通过一定的代码实现获取图片的后缀名。 首先,我们需要明确一下目标:根据图片的链接地址获取图片的后缀名。这个目标可以分解为以下几个步骤: 从链接地址中获取图片的文件名; 将文件名转换成小写形式; 从文件名中获取后缀名。 以下是详细…

    C# 2023年6月1日
    00
  • C#构建分页应用的方法分析

    C#构建分页应用的方法分析 分页是Web开发中非常常见的功能之一,通过分页可以将大量的数据进行分割并且以可读性更高的形式显示给用户。在C#中,我们可以通过多种方式来构建分页应用。本文将会详细介绍三种常见的构建分页应用的方法。 方法一:使用SQL语句进行分页 第一种方式是使用SQL语句进行分页,在这种方法中,我们可以在查询的SQL语句中添加分页的条件,从而实现…

    C# 2023年5月31日
    00
  • 基于jquery的分页控件(C#)

    基于jQuery的分页控件(C#)攻略 概述 本文将介绍如何使用jQuery编写基于C#的分页控件。分页控件可以提高页面的易读性和易用性,方便用户查看数据。 分页控件的实现方式 实现一个分页控件主要分为两个部分: 服务端代码,用于提供数据或者查询数据(本文中使用C#做演示)。 客户端代码,用于实现分页控件的交互和显示(本文中使用jQuery做演示)。 服务端…

    C# 2023年5月31日
    00
  • c# .net在WEB页中的COOKIES设置技巧

    以下是“c# .net在WEB页中的COOKIES设置技巧”的攻略: 1. 什么是Cookies? Cookie(cookie,小甜饼)是一种用于存储会话信息的小型数据文件,与某个特定的Web站点相关联。Cookie在服务器和Web浏览器之间传递,并可用于存储个人信息,如用户名、密码等等。这可以大大提高用户体验,因为它允许用户在未来使用数据而无需重新登录。 …

    C# 2023年5月31日
    00
  • IIS7.5中调试.Net 4.0网站出现无厘头、500错误的解决方法

    在IIS7.5中调试.Net4.0网站时,有时会出现无厘头、500错误的情况。这可能是由于IIS7.5没有正确配置.Net4.0应用程序池而导致的。本文将提供解决方案,帮助解决这个问题。 问题描述 在IIS7.5中调试.Net4.0网站时,有时会出现无厘头、500错误的情况。具体表现为,网站无法正常运行,或者在使用某些功能时崩溃。 解决方案 方法一:配置.N…

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