当前位置: 首页 > web >正文

Pattern解说

1. 模式的类型

根据其范围和目的,模式可以分为以下几类:

a. 创建型模式(Creational Patterns)
  • 目的:处理对象的创建机制,尝试以适合情境的方式创建对象。
  • 示例
    • 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
    • 工厂方法模式(Factory Method):定义一个用于创建对象的接口,但让子类决定实例化哪一个类。
    • 抽象工厂模式(Abstract Factory):提供一个接口,用于创建一系列相关或依赖的对象,而无需指定它们的具体类。
    • 建造者模式(Builder):将复杂对象的构造与其表示分离,使得相同的构造过程可以创建不同的表示。
    • 原型模式(Prototype):使用一个原型实例指定要创建的对象种类,并通过复制这个原型来创建新对象。
b. 结构型模式(Structural Patterns)
  • 目的:关注类与对象的组合方式,以形成更大的结构。
  • 示例
    • 适配器模式(Adapter):将一个类的接口转换为客户期望的另一个接口,使得原本不兼容的类可以协同工作。
    • 装饰器模式(Decorator):动态地给一个对象添加或覆盖行为。
    • 组合模式(Composite):将对象组合成树形结构,以表示部分-整体层次结构。
    • 外观模式(Facade):为大型代码体(如类库)提供一个简化的接口。
    • 代理模式(Proxy):为其他对象提供一个代理或占位符,以控制对该对象的访问。
    • 桥接模式(Bridge):将抽象与其实现解耦,使两者可以独立变化。
    • 享元模式(Flyweight):通过共享高效地支持大量细粒度对象。
c. 行为型模式(Behavioral Patterns)
  • 目的:关注对象之间的通信,即对象之间发生了什么以及它们如何协同工作。
  • 示例
    • 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。
    • 策略模式(Strategy):定义一个算法家族,分别封装起来,并使它们可以互换。
    • 命令模式(Command):将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
    • 责任链模式(Chain of Responsibility):避免请求的发送者与接收者之间的耦合,让多个对象都有机会处理请求。
    • 状态模式(State):允许一个对象在其内部状态改变时改变其行为。
    • 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
    • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。
    • 迭代器模式(Iterator):提供一种顺序访问聚合对象中各个元素的方法,而不暴露该对象的内部表示。
d. 并发模式(Concurrency Patterns)
  • 目的:处理多线程编程和同步问题。
  • 示例
    • 生产者-消费者模式(Producer-Consumer):在多线程环境中协调项目的生产和消费。
    • 读者-写者模式(Readers-Writers):管理多个线程对共享资源的访问,其中一些线程读取,另一些线程写入。
    • 线程池模式(Thread Pool):管理一组工作线程以异步执行任务。
    • 锁模式(Lock):控制多个线程对共享资源的访问,确保互斥。

2. 使用模式的好处

  • 可重用性:模式提供了可重用的解决方案,可以应用于不同的问题和情境。
  • 沟通:它们为开发者提供了一种共同的语言,使得设计决策的沟通更加容易。
  • 可维护性:使用模式设计的系统更易于维护和扩展。
  • 可扩展性:模式通常促进可扩展和灵活的架构。
  • 最佳实践:它们封装了最佳实践和经过验证的解决方案,减少了出错的可能性。

3. 示例:单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

Java中的实现
public class Singleton {// 类的私有静态实例private static Singleton instance;// 私有构造函数以防止实例化private Singleton() {}// 提供访问实例的公共方法public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
使用
public class Main {public static void main(String[] args) {Singleton singleton = Singleton.getInstance();// 所有对getInstance()的调用都返回相同的实例}
}

4. 示例:观察者模式(Observer Pattern)

观察者模式定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。

Java中的实现
// 主题接口
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}// 观察者接口
public interface Observer {void update(float temp, float humidity, float pressure);
}// 具体主题
public class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObservers();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}
}// 具体观察者
public class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("当前条件: " + temperature + "华氏度, " + humidity + "%湿度");}
}
使用
public class Main {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();weatherData.registerObserver(currentDisplay);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(82, 70, 29.2f);}
}

5. 结论

模式是软件设计和架构中的强大工具。它们提供了经过验证的解决方案,促进了最佳实践的实现,并增强了开发者之间的沟通。

通过理解和适当应用模式,开发者可以创建更健壮、更易于维护和扩展的系统。

联系方式:https://t.me/XMOhost26

交流技术群:https://t.me/owolai007

http://www.xdnf.cn/news/7503.html

相关文章:

  • CPU与vivado编译速度关系
  • C++_AVL树
  • vue2.0 的计算属性
  • 人员管理2302版本
  • 特征筛选方法总结
  • frida 配置
  • Linux基础开发工具三(git,gdb/cgdb)
  • python next 函数
  • JVM核心配置参数详解与调优指南
  • JVM之GC常见的垃圾回收器
  • 深度学习————模型保存与部署
  • pkucpc2025 L:Game on Tree
  • python学习day2(未写完,明天继续补充)
  • 洛谷B3876—— [信息与未来 2015] 中间值
  • 为 Windows 和 Ubuntu 中设定代理服务器的详细方法
  • 4款好用的备忘录记事工具分享
  • Spring boot 集成 Knife4j
  • 网络I/O学习-poll(三)
  • 范围管理的实践策略与创新应用
  • 头歌之软件工程-数据设计
  • 433. 最小基因变化
  • AcWing 223. 阿九大战朱最学——扩展欧几里得算法
  • Javascript本地存储的方式有哪些?区别及应用场景?(含Deep Seek讲解)
  • [长城杯 2024]anote
  • 怎么利用JS根据坐标判断构成单个多边形是否合法
  • HarmonyOS Next应用分层架构下组件封装开发实践
  • 子网前缀长度
  • 【General Agent Benchmark】论文分享No.12:LLF-Bench
  • Python训练第三十天
  • 新一代请求库niquests使用入门