### Java 23种设计模式详解 #### 一、设计模式概述 设计模式是一种编码实践,旨在通过标准化的解决方案来解决常见的软件设计问题。这些模式不仅有助于提高代码的可读性和可维护性,还能增强软件的灵活性和扩展性。本文将详细介绍23种常用的设计模式,分为创建型模式、结构型模式和行为型模式三大类。 #### 二、设计模式的六大原则 1. **开闭原则**(Open-Closed Principle, OCP) - 描述:开闭原则提倡代码应该是开放扩展但封闭修改的。这意味着我们可以添加新功能而不需改变现有代码。这一原则主要通过抽象和封装来实现。 2. **里氏替换原则**(Liskov Substitution Principle, LSP) - 描述:里氏替换原则强调子类必须能够替换其父类并且不会导致程序错误。这有助于确保继承的正确使用,避免因不当的继承而引入的错误。 3. **依赖倒置原则**(Dependency Inversion Principle, DIP) - 描述:依赖倒置原则建议模块应该依赖于抽象而非具体实现。这有助于降低模块间的耦合度,提高系统的灵活性。 4. **接口隔离原则**(Interface Segregation Principle, ISP) - 描述:接口隔离原则鼓励定义多个专门的接口而不是一个庞大的通用接口。这样可以让客户端仅依赖它们实际需要的方法,从而降低依赖复杂度。 5. **迪米特法则**(Law of Demeter, LoD) - 描述:迪米特法则又称为最少知道原则,主张一个对象应该尽可能少地了解其他对象,以减少对象之间的耦合。 6. **合成复用原则**(Composite Reuse Principle, CRP) - 描述:合成复用原则推荐使用对象组合或聚合来代替继承以实现代码复用。这种方法更灵活且减少了继承带来的负面影响。 #### 三、Java中的23种设计模式详解 1. **工厂方法模式**(Factory Method) - **描述**:工厂方法模式提供了一个创建对象的接口,但允许子类决定实例化哪个类。这种模式将实例创建的责任委托给了子类。 - **示例**: ```java public interface Sender { void send(); } public class MailSender implements Sender { @Override public void send() { System.out.println("This is mail sender!"); } } public class SmsSender implements Sender { @Override public void send() { System.out.println("This is sms sender!"); } } public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } return null; } } public class Client { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("mail"); sender.send(); // 输出 "This is mail sender!" } } ``` 2. **抽象工厂模式**(Abstract Factory) - **描述**:抽象工厂模式提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这对于构建一组相关的产品非常有用。 - **示例**:可以通过创建不同的工厂类来生成不同风格的界面组件集合,如Windows风格或MacOS风格的按钮等。 3. **单例模式**(Singleton) - **描述**:确保一个类只有一个实例,并提供一个全局访问点。这对于控制资源访问非常有用,比如数据库连接或日志文件。 - **示例**:通过静态内部类实现懒加载单例模式。 4. **建造者模式**(Builder) - **描述**:逐步构造一个复杂的对象。它的优点是能够清晰地区分出各个构建步骤。 - **示例**:构建复杂的对象,如XML文档。 5. **原型模式**(Prototype) - **描述**:通过复制一个已有的实例来创建新的实例。适用于对象初始化成本较高的场景。 - **示例**:游戏中的NPC克隆。 6. **适配器模式**(Adapter) - **描述**:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 - **示例**:将USB接口的设备适配为支持HDMI接口的显示设备。 7. **装饰器模式**(Decorator) - **描述**:动态地给一个对象添加一些额外的职责。就增加功能而言,装饰器模式相比生成子类更加灵活。 - **示例**:为文本处理添加多种格式化选项,如加粗、斜体等。 8. **代理模式**(Proxy) - **描述**:为其他对象提供一种代理以控制对这个对象的访问。 - **示例**:远程代理、虚拟代理等。 9. **外观模式**(Facade) - **描述**:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - **示例**:复杂的多媒体播放器API简化为简单的播放、暂停等操作。 10. **桥接模式**(Bridge) - **描述**:将抽象部分与它的实现部分分离,使它们都可以独立变化。 - **示例**:图形库中形状的绘制与具体平台的分离。 11. **组合模式**(Composite) - **描述**:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 - **示例**:文件系统中的文件夹和文件组织结构。 12. **享元模式**(Flyweight) - **描述**:运用共享技术有效地支持大量细粒度的对象。 - **示例**:在字体渲染时使用共享字符对象以节省内存。 13. **策略模式**(Strategy) - **描述**:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 - **示例**:不同的排序算法应用于同一数据集。 14. **模板方法模式**(Template Method) - **描述**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **示例**:Web应用的登录过程。 15. **观察者模式**(Observer) - **描述**:定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **示例**:新闻网站上的订阅者接收最新文章的通知。 16. **迭代器模式**(Iterator) - **描述**:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **示例**:遍历集合。 17. **责任链模式**(Chain of Responsibility) - **描述**:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 - **示例**:处理用户请求的不同层级。 18. **命令模式**(Command) - **描述**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 - **示例**:撤销操作功能。 19. **备忘录模式**(Memento) - **描述**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 - **示例**:文档编辑器的撤销功能。 20. **状态模式**(State) - **描述**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 - **示例**:游戏中的角色状态变化。 21. **访问者模式**(Visitor) - **描述**:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 - **示例**:解析表达式树。 22. **中介者模式**(Mediator) - **描述**:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 - **示例**:聊天室服务器作为中介处理客户端消息。 23. **解释器模式**(Interpreter) - **描述**:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 - **示例**:SQL查询解析器。 通过学习这些设计模式及其应用场景,开发者可以更好地组织和优化自己的代码,提高软件的质量和可维护性。每种模式都有其特定的应用场景和解决的问题,理解这些模式将帮助开发人员编写出更高效、更易于维护的代码。
剩余63页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助