• Java的设计模式基本概念及使用场景


    设计模式是软件开发中常用的解决问题的可重用模式。它提供了一套经过验证的解决方案,可以帮助开发人员解决常见问题,并提高代码的可维护性和可扩展性。Java中有23种常见的设计模式,可以分为三个类别:创建型模式、结构型模式和行为型模式。

    1. 创建型模式:用于创建对象的模式,隐藏了对象的创建过程。
    • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
    1. public class Singleton {
    2. private static Singleton instance;
    3. private Singleton() {
    4. }
    5. public static Singleton getInstance() {
    6. if (instance == null) {
    7. instance = new Singleton();
    8. }
    9. return instance;
    10. }
    11. }

    • 工厂模式(Factory):通过一个工厂类创建对象,将对象的实例化过程封装起来。
    1. public interface Shape {
    2. void draw();
    3. }
    4. public class Circle implements Shape {
    5. @Override
    6. public void draw() {
    7. System.out.println("Draw a circle");
    8. }
    9. }
    10. public class Rectangle implements Shape {
    11. @Override
    12. public void draw() {
    13. System.out.println("Draw a rectangle");
    14. }
    15. }
    16. public class ShapeFactory {
    17. public Shape createShape(String shapeType) {
    18. if (shapeType.equalsIgnoreCase("circle")) {
    19. return new Circle();
    20. } else if (shapeType.equalsIgnoreCase("rectangle")) {
    21. return new Rectangle();
    22. }
    23. return null;
    24. }
    25. }

    1. 结构型模式:用于描述如何将对象和类组合成更大的结构。
    • 适配器模式(Adapter):将一个类的接口转换成客户端所期望的接口。
    1. public interface MediaPlayer {
    2. void play(String audioType, String fileName);
    3. }
    4. public interface AdvancedMediaPlayer {
    5. void playVlc(String fileName);
    6. void playMp4(String fileName);
    7. }
    8. public class VlcPlayer implements AdvancedMediaPlayer {
    9. @Override
    10. public void playVlc(String fileName) {
    11. System.out.println("Playing vlc file: " + fileName);
    12. }
    13. @Override
    14. public void playMp4(String fileName) {
    15. // do nothing
    16. }
    17. }
    18. public class Mp4Player implements AdvancedMediaPlayer {
    19. @Override
    20. public void playVlc(String fileName) {
    21. // do nothing
    22. }
    23. @Override
    24. public void playMp4(String fileName) {
    25. System.out.println("Playing mp4 file: " + fileName);
    26. }
    27. }
    28. public class MediaAdapter implements MediaPlayer {
    29. private AdvancedMediaPlayer advancedMediaPlayer;
    30. public MediaAdapter(String audioType) {
    31. if (audioType.equalsIgnoreCase("vlc")) {
    32. advancedMediaPlayer = new VlcPlayer();
    33. } else if (audioType.equalsIgnoreCase("mp4")) {
    34. advancedMediaPlayer = new Mp4Player();
    35. }
    36. }
    37. @Override
    38. public void play(String audioType, String fileName) {
    39. if (audioType.equalsIgnoreCase("vlc")) {
    40. advancedMediaPlayer.playVlc(fileName);
    41. } else if (audioType.equalsIgnoreCase("mp4")) {
    42. advancedMediaPlayer.playMp4(fileName);
    43. }
    44. }
    45. }
    46. public class AudioPlayer implements MediaPlayer {
    47. private MediaAdapter mediaAdapter;
    48. @Override
    49. public void play(String audioType, String fileName) {
    50. if (audioType.equalsIgnoreCase("mp3")) {
    51. System.out.println("Playing mp3 file: " + fileName);
    52. } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
    53. mediaAdapter = new MediaAdapter(audioType);
    54. mediaAdapter.play(audioType, fileName);
    55. } else {
    56. System.out.println("Format not supported");
    57. }
    58. }
    59. }

    1. 行为型模式:用于描述对象之间的通信方式和职责分配。
    • 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会收到通知。
    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class Subject {
    4. private List observers = new ArrayList<>();
    5. private int state;
    6. public int getState() {
    7. return state;
    8. }
    9. public void setState(int state) {
    10. this.state = state;
    11. notifyAllObservers();
    12. }
    13. public void attach(Observer observer) {
    14. observers.add(observer);
    15. }
    16. public void notifyAllObservers() {
    17. for (Observer observer : observers) {
    18. observer.update();
    19. }
    20. }
    21. }
    22. public abstract class Observer {
    23. protected Subject subject;
    24. public abstract void update();
    25. }
    26. public class BinaryObserver extends Observer {
    27. public BinaryObserver(Subject subject) {
    28. this.subject = subject;
    29. this.subject.attach(this);
    30. }
    31. @Override
    32. public void update() {
    33. System.out.println("Binary: " + Integer.toBinaryString(subject.getState()));
    34. }
    35. }
    36. public class OctalObserver extends Observer {
    37. public OctalObserver(Subject subject) {
    38. this.subject = subject;
    39. this.subject.attach(this);
    40. }
    41. @Override
    42. public void update() {
    43. System.out.println("Octal: " + Integer.toOctalString(subject.getState()));
    44. }
    45. }
    46. public class HexObserver extends Observer {
    47. public HexObserver(Subject subject) {
    48. this.subject = subject;
    49. this.subject.attach(this);
    50. }
    51. @Override
    52. public void update() {
    53. System.out.println("Hex: " + Integer.toHexString(subject.getState()));
    54. }
    55. }
    56. public class Main {
    57. public static void main(String[] args) {
    58. Subject subject = new Subject();
    59. new BinaryObserver(subject);
    60. new OctalObserver(subject);
    61. new HexObserver(subject);
    62. subject.setState(10);
    63. subject.setState(15);
    64. }
    65. }
  • 相关阅读:
    第一颗国产 单/双端口 MIPI CSI/DSI 至 HDMI 1.4 发射器 芯片LT9611
    Git拉取指定文件或者文件夹
    (附源码)ssmJavaEE无人机数据管理系统 毕业设计 111022
    【python】python+numpy模块读、写raw图并使用opencv显示图片
    中国网络安全审查认证和市场监管大数据中心数据合规官CCRC-DCO
    MySQL 免安装版安装配置&忘记密码时,重置密码
    Android:Handler
    可上手 JVM 调优实战指南
    蝴蝶书--ChatGPT基础科普
    C++获取系统毫秒级时间(自1970年1月1日至今的毫秒数)
  • 原文地址:https://blog.csdn.net/qq_38366111/article/details/136689676