赞
踩
代理模式是一种结构型设计模式,允许在访问对象时提供一种代理以控制对该对象的访问。代理模式通常在客户端和实际对象之间引入了一个代理对象,客户端通过代理对象间接访问实际对象,从而可以在访问过程中添加额外的功能,例如权限验证、缓存、延迟加载等。
结构
场景
优点
缺点
示例
// 主题接口 interface Subject { void request(); } // 真实主题类 class RealSubject implements Subject { @Override public void request() { System.out.println("真实主题类处理请求"); } } // 代理类 class Proxy implements Subject { private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void request() { // 在访问真实主题前执行一些额外的操作 System.out.println("代理类处理请求之前的操作"); // 调用真实主题对象的方法 realSubject.request(); // 在访问真实主题后执行一些额外的操作 System.out.println("代理类处理请求之后的操作"); } } public class ProxyPatternExample { public static void main(String[] args) { // 创建真实主题对象 RealSubject realSubject = new RealSubject(); // 创建代理对象,并将真实主题对象传递给代理对象 Proxy proxy = new Proxy(realSubject); // 通过代理对象调用真实主题的方法 proxy.request(); } }
代理类处理请求之前的操作
真实主题类处理请求
代理类处理请求之后的操作
门面模式是一种结构型设计模式,旨在为复杂子系统提供一个简单的接口,以便与外部系统进行交互。门面模式通过将复杂系统的多个接口封装在一个单一的接口中,简化了客户端与系统之间的交互。
结构
场景
优点
缺点
示例
// 子系统 - 音频播放器 class AudioPlayer { public void play() { System.out.println("播放音频"); } public void pause() { System.out.println("暂停音频"); } public void stop() { System.out.println("停止音频"); } } // 子系统 - 视频播放器 class VideoPlayer { public void play() { System.out.println("播放视频"); } public void pause() { System.out.println("暂停视频"); } public void stop() { System.out.println("停止视频"); } } // 门面类 - 多媒体播放器门面 class MediaPlayerFacade { private AudioPlayer audioPlayer; private VideoPlayer videoPlayer; public MediaPlayerFacade() { audioPlayer = new AudioPlayer(); videoPlayer = new VideoPlayer(); } // 播放音频和视频 public void play() { audioPlayer.play(); videoPlayer.play(); } // 暂停音频和视频 public void pause() { audioPlayer.pause(); videoPlayer.pause(); } // 停止音频和视频 public void stop() { audioPlayer.stop(); videoPlayer.stop(); } } public class FacadePatternExample { public static void main(String[] args) { // 使用门面模式简化客户端与复杂系统之间的交互 MediaPlayerFacade mediaPlayer = new MediaPlayerFacade(); mediaPlayer.play(); mediaPlayer.pause(); mediaPlayer.stop(); } }
外观模式是一种结构型设计模式,旨在提供一个简单的接口,隐藏复杂的系统内部结构,使得客户端可以更容易地使用系统。外观模式将系统的多个子系统封装在一个统一的接口中,为客户端提供了一个更高层次的接口,从而简化了客户端与系统之间的交互。
结构
场景
优点
缺点
示例
// 子系统A class SubsystemA { public void operationA() { System.out.println("子系统A的操作A"); } } // 子系统B class SubsystemB { public void operationB() { System.out.println("子系统B的操作B"); } } // 子系统C class SubsystemC { public void operationC() { System.out.println("子系统C的操作C"); } } // 外观类 class Facade { private SubsystemA subsystemA; private SubsystemB subsystemB; private SubsystemC subsystemC; public Facade() { this.subsystemA = new SubsystemA(); this.subsystemB = new SubsystemB(); this.subsystemC = new SubsystemC(); } // 提供一个统一的接口,供客户端调用 public void operation() { System.out.println("外观类调用子系统A、B、C的操作:"); subsystemA.operationA(); subsystemB.operationB(); subsystemC.operationC(); } } // 客户端代码 public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.operation(); } }
外观类调用子系统A、B、C的操作:
子系统A的操作A
子系统B的操作B
子系统C的操作C
桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。桥接模式通过将抽象和实现分离,使得它们可以独立地变化,从而提高了系统的灵活性和可扩展性。
结构
场景
优点
缺点
示例
// 实现部分接口:消息发送方式 interface MessageSender { void sendMessage(String message); } // 具体实现部分:短信发送 class SmsSender implements MessageSender { @Override public void sendMessage(String message) { System.out.println("通过短信发送消息:" + message); } } // 具体实现部分:邮件发送 class EmailSender implements MessageSender { @Override public void sendMessage(String message) { System.out.println("通过邮件发送消息:" + message); } } // 抽象部分:消息 abstract class Message { // 持有实现部分的引用 protected MessageSender sender; // 构造方法,传入实现部分的对象 public Message(MessageSender sender) { this.sender = sender; } // 发送消息的抽象方法 public abstract void send(); } // 扩展抽象部分:普通消息 class NormalMessage extends Message { // 构造方法,调用父类构造方法 public NormalMessage(MessageSender sender) { super(sender); } // 实现发送消息的方法 @Override public void send() { // 调用实现部分的方法 sender.sendMessage("普通消息"); } } // 扩展抽象部分:加急消息 class UrgentMessage extends Message { // 构造方法,调用父类构造方法 public UrgentMessage(MessageSender sender) { super(sender); } // 实现发送消息的方法 @Override public void send() { // 调用实现部分的方法 sender.sendMessage("加急消息"); } } // 客户端 public class Client { public static void main(String[] args) { // 创建短信发送对象 MessageSender smsSender = new SmsSender(); // 创建邮件发送对象 MessageSender emailSender = new EmailSender(); // 创建普通消息对象,传入短信发送对象 Message normalMessage1 = new NormalMessage(smsSender); // 发送普通消息 normalMessage1.send(); // 创建加急消息对象,传入邮件发送对象 Message urgentMessage1 = new UrgentMessage(emailSender); // 发送加急消息 urgentMessage1.send(); // 创建普通消息对象,传入邮件发送对象 Message normalMessage2 = new NormalMessage(emailSender); // 发送普通消息 normalMessage2.send(); // 创建加急消息对象,传入短信发送对象 Message urgentMessage2 = new UrgentMessage(smsSender); // 发送加急消息 urgentMessage2.send(); } }
通过短信发送消息:普通消息
通过邮件发送消息:加急消息
通过邮件发送消息:普通消息
通过短信发送消息:加急消息
适配器模式是一种结构设计模式,用于使接口不兼容的类可以一起工作。它允许将现有类的接口转换为所需的接口,从而使得不兼容的类可以进行协同工作。
结构
场景
优点
缺点
示例
// 目标接口 interface Target { void request(); } // 具体目标类 class ConcreteTarget implements Target { @Override public void request() { System.out.println("具体目标类的方法被调用"); } } // 适配器类 class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); } } // 被适配者类 class Adaptee { public void specificRequest() { System.out.println("被适配者类的方法被调用"); } } // 客户端代码 public class Client { public static void main(String[] args) { // 使用具体目标类 Target target = new ConcreteTarget(); target.request(); // 输出:具体目标类的方法被调用 // 使用适配器类 Adaptee adaptee = new Adaptee(); Target adapter = new Adapter(adaptee); adapter.request(); // 输出:被适配者类的方法被调用 } }
具体目标类的方法被调用
被适配者类的方法被调用
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来最小化内存使用或计算开销。该模式适用于大量相似对象的场景,以减少内存占用和提高性能。
结构
场景
优点
缺点
示例
import java.util.HashMap; import java.util.Map; // 享元接口 interface CharFlyweight { void display(String font); } // 具体享元类:字符对象 class Char implements CharFlyweight { private char character; public Char(char character) { this.character = character; } @Override public void display(String font) { System.out.println("Character: " + character + ", Font: " + font); } } // 享元工厂类 class CharFactory { private Map<Character, CharFlyweight> charMap = new HashMap<>(); public CharFlyweight getChar(char character) { if (!charMap.containsKey(character)) { charMap.put(character, new Char(character)); } return charMap.get(character); } } // 客户端 public class Client { public static void main(String[] args) { CharFactory charFactory = new CharFactory(); CharFlyweight charA = charFactory.getChar('A'); charA.display("Arial"); CharFlyweight charB = charFactory.getChar('B'); charB.display("Times New Roman"); // 再次获取相同的字符对象 CharFlyweight charA2 = charFactory.getChar('A'); charA2.display("Calibri"); } }
Character: A, Font: Arial
Character: B, Font: Times New Roman
Character: A, Font: Calibri
装饰器模式是一种结构设计模式,它允许你动态地将责任附加到对象上。装饰器模式提供了一种灵活的方式来扩展对象的功能,而无需通过子类化来实现。
结构
场景
优点
缺点
示例
// 抽象组件接口(Component Interface) interface Component { void operation(); } // 具体组件类(Concrete Component Class) class ConcreteComponent implements Component { public void operation() { System.out.println("Performing operation in the concrete component."); } } // 抽象装饰器类(Decorator Abstract Class) abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); } } // 具体装饰器类(Concrete Decorator Class) class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); additionalOperationA(); } private void additionalOperationA() { System.out.println("Performing additional operation A."); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); additionalOperationB(); } private void additionalOperationB() { System.out.println("Performing additional operation B."); } } // 客户端代码 public class Main { public static void main(String[] args) { // 创建具体组件对象 Component component = new ConcreteComponent(); // 对具体组件对象进行装饰 Component decoratedComponent = new ConcreteDecoratorA(new ConcreteDecoratorB(component)); // 执行操作 decoratedComponent.operation(); } }
Performing operation in the concrete component.
Performing additional operation B.
Performing additional operation A.
组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。通过组合模式,客户端可以统一对待单个对象和组合对象,从而简化了客户端的代码。
结构
场景
优点
缺点
示例
import java.util.ArrayList; import java.util.List; // 组件接口 interface Component { void operation(); } // 叶子节点 class Leaf implements Component { private String name; public Leaf(String name) { this.name = name; } @Override public void operation() { System.out.println("Leaf " + name + " operation"); } } // 复合节点 class Composite implements Component { private String name; private List<Component> children = new ArrayList<>(); public Composite(String name) { this.name = name; } public void add(Component component) { children.add(component); } public void remove(Component component) { children.remove(component); } @Override public void operation() { System.out.println("Composite " + name + " operation"); for (Component component : children) { component.operation(); } } } public class CompositePatternExample { public static void main(String[] args) { Component leaf1 = new Leaf("Leaf1"); Component leaf2 = new Leaf("Leaf2"); Component leaf3 = new Leaf("Leaf3"); Composite composite1 = new Composite("Composite1"); composite1.add(leaf1); composite1.add(leaf2); Composite composite2 = new Composite("Composite2"); composite2.add(leaf3); Composite root = new Composite("Root"); root.add(composite1); root.add(composite2); root.operation(); } }
Composite Root operation
Composite Composite1 operation
Leaf Leaf1 operation
Leaf Leaf2 operation
Composite Composite2 operation
Leaf Leaf3 operation
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。