深入浅出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技术站