(Java根本笔记log)Java中常见的几种设计模式详解

[复制链接]
发表于 2025-7-31 05:05:24 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
媒介:
  在 Java 编程里,设计模式是被反复利用、多数人知晓、经过分类编目的代码设计履历总结。他能资助开辟者更高效地解决常见问题,提升代码的可维护性、可扩展性和复用性。下面介绍Java 中几种常见的设计模式。

  •         单例模式(Singleton Pattern)
  •         工厂模式(Factory Pattern)
  •         代理模式(Proxy Pattern)
  •         装饰器模式(Decorator Pattern)
  •         观察者模式(Observer Pattern)
  •         战略模式(Strategy Pattern)
  •         模板方法模式(Template Method Pattern)
  •         适配器模式(Adapter Pattern)
  •         责任链模式(Chain of Responsibility Pattern)
 
1.单例模式(Singleton Pattern)

核心思想:封装化所有构造方法确保一个类只有一个实例,并提供一个全局访问点。
示例:
  1. public class Singleton {
  2.     // 类加载时不创建实例
  3.     private static volatile Singleton instance;
  4.     // 私有构造函数,防止外部实例化
  5.     private Singleton() {}
  6.     // 提供全局访问点,使用双重检查锁定机制保证线程安全
  7.     public static Singleton getInstance() {
  8.         if (instance == null) {
  9.             synchronized (Singleton.class) {
  10.                 if (instance == null) {
  11.                     instance = new Singleton();
  12.                 }
  13.             }
  14.         }
  15.         return instance;
  16.     }
  17. }
复制代码
2.工厂模式(Factory Pattern)

核心思想:他通过封装对象的创建逻辑,实现了对象创建和利用的分离,提高了代码的可维护性和可扩展性。
示例:
  1. // 接口
  2. interface Shape {
  3.     void draw();
  4. }
  5. // 实现类
  6. class Circle implements Shape {
  7.     @Override
  8.     public void draw() {
  9.         System.out.println("画一个圆形");
  10.     }
  11. }
  12. class Rectangle implements Shape {
  13.     @Override
  14.     public void draw() {
  15.         System.out.println("画一个矩形");
  16.     }
  17. }
  18. // 工厂类
  19. class ShapeFactory {
  20.     public Shape getShape(String shapeType) {
  21.         if (shapeType == null) {
  22.             return null;
  23.         }
  24.         if (shapeType.equalsIgnoreCase("CIRCLE")) {
  25.             return new Circle();
  26.         } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
  27.             return new Rectangle();
  28.         }
  29.         return null;
  30.     }
  31. }
复制代码
3.代理模式(Proxy Pattern)

核心思想:为其他对象提供一种代理以控制对这个对象的访问。
示例:
  1. // 抽象主题接口
  2. public interface Subject {
  3.     void request();
  4. }
  5. // 真实主题类
  6. public class RealSubject implements Subject {
  7.     @Override
  8.     public void request() {
  9.         System.out.println("RealSubject request");
  10.     }
  11. }
  12. // 代理类
  13. public class Proxy implements Subject {
  14.     private RealSubject realSubject;
  15.     @Override
  16.     public void request() {
  17.         if (realSubject == null) {
  18.             realSubject = new RealSubject();
  19.         }
  20.         realSubject.request();  // 代理控制对真实主题的访问
  21.     }
  22. }
  23. // 客户端代码
  24. public class Client {
  25.     public static void main(String[] args) {
  26.         Subject proxy = new Proxy();
  27.         proxy.request();  // 通过代理访问真实主题
  28.     }
  29. }
复制代码
4.装饰器模式(Decorator Pattern)

核心思想:装饰器模式动态地给一个对象添加一些额外的职责。
示例:
  1. // 接口
  2. interface Coffee {
  3.     double getCost();
  4.     String getDescription();
  5. }
  6. // 基础实现
  7. class SimpleCoffee implements Coffee {
  8.     @Override
  9.     public double getCost() {
  10.         return 1.0;
  11.     }
  12.     @Override
  13.     public String getDescription() {
  14.         return "简单咖啡";
  15.     }
  16. }
  17. // 装饰器抽象类
  18. abstract class CoffeeDecorator implements Coffee {
  19.     protected Coffee decoratedCoffee;
  20.     public CoffeeDecorator(Coffee decoratedCoffee) {
  21.         this.decoratedCoffee = decoratedCoffee;
  22.     }
  23.     @Override
  24.     public double getCost() {
  25.         return decoratedCoffee.getCost();
  26.     }
  27.     @Override
  28.     public String getDescription() {
  29.         return decoratedCoffee.getDescription();
  30.     }
  31. }
  32. // 具体装饰器
  33. class Milk extends CoffeeDecorator {
  34.     public Milk(Coffee decoratedCoffee) {
  35.         super(decoratedCoffee);
  36.     }
  37.     @Override
  38.     public double getCost() {
  39.         return decoratedCoffee.getCost() + 0.5;
  40.     }
  41.     @Override
  42.     public String getDescription() {
  43.         return decoratedCoffee.getDescription() + ", 加牛奶";
  44.     }
  45. }
复制代码
5.观察者模式(Observer Pattern)

核心思想:观察者模式界说对象间的一种一对多的依靠关系,当一个对象的状态发生改变时,所有依靠它的对象都会得到通知并被自动更新。
示例:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. // 主题接口
  4. interface Subject {
  5.     void registerObserver(Observer o);
  6.     void removeObserver(Observer o);
  7.     void notifyObservers();
  8. }
  9. // 观察者接口
  10. interface Observer {
  11.     void update(double temperature, double humidity, double pressure);
  12. }
  13. // 具体主题
  14. class WeatherData implements Subject {
  15.     private List<Observer> observers;
  16.     private double temperature;
  17.     private double humidity;
  18.     private double pressure;
  19.     public WeatherData() {
  20.         observers = new ArrayList<>();
  21.     }
  22.     @Override
  23.     public void registerObserver(Observer o) {
  24.         observers.add(o);
  25.     }
  26.     @Override
  27.     public void removeObserver(Observer o) {
  28.         observers.remove(o);
  29.     }
  30.     @Override
  31.     public void notifyObservers() {
  32.         for (Observer observer : observers) {
  33.             observer.update(temperature, humidity, pressure);
  34.         }
  35.     }
  36.     public void measurementsChanged() {
  37.         notifyObservers();
  38.     }
  39.     public void setMeasurements(double temperature, double humidity, double pressure) {
  40.         this.temperature = temperature;
  41.         this.humidity = humidity;
  42.         this.pressure = pressure;
  43.         measurementsChanged();
  44.     }
  45. }
复制代码
6.战略模式(Strategy Pattern)

核心思想:战略模式界说一系列的算法,并将每个算法封装起来,使他们可以相互更换。
示例:
  1. // 策略接口
  2. interface PaymentStrategy {
  3.     void pay(int amount);
  4. }
  5. // 具体策略
  6. class CreditCardStrategy implements PaymentStrategy {
  7.     private String cardNumber;
  8.     private String cvv;
  9.     private String dateOfExpiry;
  10.     public CreditCardStrategy(String cardNumber, String cvv, String dateOfExpiry) {
  11.         this.cardNumber = cardNumber;
  12.         this.cvv = cvv;
  13.         this.dateOfExpiry = dateOfExpiry;
  14.     }
  15.     @Override
  16.     public void pay(int amount) {
  17.         System.out.println(amount + " 元使用信用卡支付");
  18.     }
  19. }
  20. class PayPalStrategy implements PaymentStrategy {
  21.     private String emailId;
  22.     private String password;
  23.     public PayPalStrategy(String emailId, String password) {
  24.         this.emailId = emailId;
  25.         this.password = password;
  26.     }
  27.     @Override
  28.     public void pay(int amount) {
  29.         System.out.println(amount + " 元使用PayPal支付");
  30.     }
  31. }
  32. // 上下文
  33. class ShoppingCart {
  34.     private PaymentStrategy paymentStrategy;
  35.     public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
  36.         this.paymentStrategy = paymentStrategy;
  37.     }
  38.     public void pay(int amount) {
  39.         paymentStrategy.pay(amount);
  40.     }
  41. }
复制代码
7.模板方法模式(Template Method Pattern)

核心思想:模板方法模式界说一个操作中的算法的骨架,而将一些步调耽误到子类中。
示例:
  1. // 抽象类
  2. abstract class Game {
  3.     abstract void initialize();
  4.     abstract void startPlay();
  5.     abstract void endPlay();
  6.     // 模板方法
  7.     public final void play() {
  8.         // 初始化游戏
  9.         initialize();
  10.         // 开始游戏
  11.         startPlay();
  12.         // 结束游戏
  13.         endPlay();
  14.     }
  15. }
  16. // 具体类
  17. class Cricket extends Game {
  18.     @Override
  19.     void initialize() {
  20.         System.out.println("板球游戏初始化,准备场地");
  21.     }
  22.     @Override
  23.     void startPlay() {
  24.         System.out.println("板球游戏开始,玩起来!");
  25.     }
  26.     @Override
  27.     void endPlay() {
  28.         System.out.println("板球游戏结束,统计分数");
  29.     }
  30. }
  31. class Football extends Game {
  32.     @Override
  33.     void initialize() {
  34.         System.out.println("足球游戏初始化,准备场地和球");
  35.     }
  36.     @Override
  37.     void startPlay() {
  38.         System.out.println("足球游戏开始,踢起来!");
  39.     }
  40.     @Override
  41.     void endPlay() {
  42.         System.out.println("足球游戏结束,统计分数");
  43.     }
  44. }
复制代码
8.适配器模式(Adapter Pattern)

核心思想:适配器模式将一个类的接口转换成客户盼望的另外一个接口。
示例:
  1. // 目标接口
  2. interface MediaPlayer {
  3.     void play(String audioType, String fileName);
  4. }
  5. // 被适配的类
  6. class VlcPlayer {
  7.     public void playVlc(String fileName) {
  8.         System.out.println("播放VLC文件: " + fileName);
  9.     }
  10. }
  11. // 适配器
  12. class MediaAdapter implements MediaPlayer {
  13.     private VlcPlayer vlcPlayer;
  14.     public MediaAdapter() {
  15.         vlcPlayer = new VlcPlayer();
  16.     }
  17.     @Override
  18.     public void play(String audioType, String fileName) {
  19.         if (audioType.equalsIgnoreCase("vlc")) {
  20.             vlcPlayer.playVlc(fileName);
  21.         }
  22.     }
  23. }
  24. // 具体实现类
  25. class AudioPlayer implements MediaPlayer {
  26.     private MediaAdapter mediaAdapter;
  27.     @Override
  28.     public void play(String audioType, String fileName) {
  29.         if (audioType.equalsIgnoreCase("vlc")) {
  30.             mediaAdapter = new MediaAdapter();
  31.             mediaAdapter.play(audioType, fileName);
  32.         } else {
  33.             System.out.println("播放 " + audioType + " 文件: " + fileName);
  34.         }
  35.     }
  36. }
复制代码
9.责任链模式(Chain of Responsibility Pattern)

核心思想:责任链模式为哀求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用。
示例:
  1. // 抽象处理者
  2. abstract class Handler {
  3.     protected Handler nextHandler;
  4.     public void setNextHandler(Handler nextHandler) {
  5.         this.nextHandler = nextHandler;
  6.     }
  7.     public abstract void handleRequest(int request);
  8. }
  9. // 具体处理者
  10. class ConcreteHandler1 extends Handler {
  11.     @Override
  12.     public void handleRequest(int request) {
  13.         if (request < 10) {
  14.             System.out.println("处理请求: " + request);
  15.         } else if (nextHandler != null) {
  16.             nextHandler.handleRequest(request);
  17.         }
  18.     }
  19. }
  20. class ConcreteHandler2 extends Handler {
  21.     @Override
  22.     public void handleRequest(int request) {
  23.         if (request >= 10 && request < 20) {
  24.             System.out.println("处理请求: " + request);
  25.         } else if (nextHandler != null) {
  26.             nextHandler.handleRequest(request);
  27.         }
  28.     }
  29. }
  30. class ConcreteHandler3 extends Handler {
  31.     @Override
  32.     public void handleRequest(int request) {
  33.         if (request >= 20) {
  34.             System.out.println("处理请求: " + request);
  35.         } else if (nextHandler != null) {
  36.             nextHandler.handleRequest(request);
  37.         }
  38.     }
  39. }
复制代码
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表