设计模式是软件开发中常用的解决问题的可重用模式。它提供了一套经过验证的解决方案,可以帮助开发人员解决常见问题,并提高代码的可维护性和可扩展性。Java中有23种常见的设计模式,可以分为三个类别:创建型模式、结构型模式和行为型模式。
- public class Singleton {
- private static Singleton instance;
-
- private Singleton() {
- }
-
- public static Singleton getInstance() {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
- public interface Shape {
- void draw();
- }
-
- public class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Draw a circle");
- }
- }
-
- public class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Draw a rectangle");
- }
- }
-
- public class ShapeFactory {
- public Shape createShape(String shapeType) {
- if (shapeType.equalsIgnoreCase("circle")) {
- return new Circle();
- } else if (shapeType.equalsIgnoreCase("rectangle")) {
- return new Rectangle();
- }
- return null;
- }
- }
- public interface MediaPlayer {
- void play(String audioType, String fileName);
- }
-
- public interface AdvancedMediaPlayer {
- void playVlc(String fileName);
- void playMp4(String fileName);
- }
-
- public class VlcPlayer implements AdvancedMediaPlayer {
- @Override
- public void playVlc(String fileName) {
- System.out.println("Playing vlc file: " + fileName);
- }
-
- @Override
- public void playMp4(String fileName) {
- // do nothing
- }
- }
-
- public class Mp4Player implements AdvancedMediaPlayer {
- @Override
- public void playVlc(String fileName) {
- // do nothing
- }
-
- @Override
- public void playMp4(String fileName) {
- System.out.println("Playing mp4 file: " + fileName);
- }
- }
-
- public class MediaAdapter implements MediaPlayer {
- private AdvancedMediaPlayer advancedMediaPlayer;
-
- public MediaAdapter(String audioType) {
- if (audioType.equalsIgnoreCase("vlc")) {
- advancedMediaPlayer = new VlcPlayer();
- } else if (audioType.equalsIgnoreCase("mp4")) {
- advancedMediaPlayer = new Mp4Player();
- }
- }
-
- @Override
- public void play(String audioType, String fileName) {
- if (audioType.equalsIgnoreCase("vlc")) {
- advancedMediaPlayer.playVlc(fileName);
- } else if (audioType.equalsIgnoreCase("mp4")) {
- advancedMediaPlayer.playMp4(fileName);
- }
- }
- }
-
- public class AudioPlayer implements MediaPlayer {
- private MediaAdapter mediaAdapter;
-
- @Override
- public void play(String audioType, String fileName) {
- if (audioType.equalsIgnoreCase("mp3")) {
- System.out.println("Playing mp3 file: " + fileName);
- } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
- mediaAdapter = new MediaAdapter(audioType);
- mediaAdapter.play(audioType, fileName);
- } else {
- System.out.println("Format not supported");
- }
- }
- }
- import java.util.ArrayList;
- import java.util.List;
-
- public class Subject {
- private List
observers = new ArrayList<>(); - private int state;
-
- public int getState() {
- return state;
- }
-
- public void setState(int state) {
- this.state = state;
- notifyAllObservers();
- }
-
- public void attach(Observer observer) {
- observers.add(observer);
- }
-
- public void notifyAllObservers() {
- for (Observer observer : observers) {
- observer.update();
- }
- }
- }
-
- public abstract class Observer {
- protected Subject subject;
-
- public abstract void update();
- }
-
- public class BinaryObserver extends Observer {
- public BinaryObserver(Subject subject) {
- this.subject = subject;
- this.subject.attach(this);
- }
-
- @Override
- public void update() {
- System.out.println("Binary: " + Integer.toBinaryString(subject.getState()));
- }
- }
-
- public class OctalObserver extends Observer {
- public OctalObserver(Subject subject) {
- this.subject = subject;
- this.subject.attach(this);
- }
-
- @Override
- public void update() {
- System.out.println("Octal: " + Integer.toOctalString(subject.getState()));
- }
- }
-
- public class HexObserver extends Observer {
- public HexObserver(Subject subject) {
- this.subject = subject;
- this.subject.attach(this);
- }
-
- @Override
- public void update() {
- System.out.println("Hex: " + Integer.toHexString(subject.getState()));
- }
- }
-
- public class Main {
- public static void main(String[] args) {
- Subject subject = new Subject();
-
- new BinaryObserver(subject);
- new OctalObserver(subject);
- new HexObserver(subject);
-
- subject.setState(10);
- subject.setState(15);
- }
- }