🙈作者簡介:練習時長兩年半的Java up主
🙉個人主頁:程序員老茶
🙊 ps:點贊👍是免費的,卻可以讓寫博客的作者開心好久好久😎
📚系列專欄:Java全棧,計算機系列(火速更新中)
💭 格言:種一棵樹最好的時間是十年前,其次是現在
🏡動動小手,點個關注不迷路,感謝寶子們一鍵三連
目錄
- 課程名:Java
- 內容/作用:知識點/設計/實驗/作業/練習
- 學習:Java設計模式
- Java設計模式
- 1. 創建型模式
- 1.1 簡單工廠模式(Simple Factory Pattern)
- 1.2 工廠方法模式(Factory Method Pattern)
- 1.3 抽象工廠模式(Abstract Factory Pattern)
- 2. 結構型模式
- 2.1 適配器模式(Adapter Pattern)
- 2.2 裝飾器模式(Decorator Pattern)
- 3. 行為型模式
- 3.1 觀察者模式(Observer Pattern)
- 3.2 策略模式(Strategy Pattern)
課程名:Java
內容/作用:知識點/設計/實驗/作業/練習
學習:Java設計模式
Java設計模式
1. 創建型模式
1.1 簡單工廠模式(Simple Factory Pattern)
簡單工廠模式通過一個工廠類來創建對象,根據不同的參數返回不同類的實例。
示例代碼:
public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}public class ShapeFactory {public static Shape createShape(String shapeType) {if (shapeType.equalsIgnoreCase("circle")) {return new Circle();} else if (shapeType.equalsIgnoreCase("rectangle")) {return new Rectangle();}return null;}
}public class Main {public static void main(String[] args) {Shape circle = ShapeFactory.createShape("circle");circle.draw();Shape rectangle = ShapeFactory.createShape("rectangle");rectangle.draw();}
}
1.2 工廠方法模式(Factory Method Pattern)
工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。
示例代碼:
public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}public interface ShapeFactory {Shape createShape();
}public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}public class Main {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape circle = circleFactory.createShape();circle.draw();ShapeFactory rectangleFactory = new RectangleFactory();Shape rectangle = rectangleFactory.createShape();rectangle.draw();}
}
1.3 抽象工廠模式(Abstract Factory Pattern)
抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
示例代碼:
public interface Color {void fill();
}public class Red implements Color {@Overridepublic void fill() {System.out.println("Filling with red color");}
}public class Blue implements Color {@Overridepublic void fill() {System.out.println("Filling with blue color");}
}public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}public interface AbstractFactory {Color createColor();Shape createShape();
}public class RedCircleFactory implements AbstractFactory {@Overridepublic Color createColor() {return new Red();}@Overridepublic Shape createShape() {return new Circle();}
}public class BlueRectangleFactory implements AbstractFactory {@Overridepublic Color createColor() {return new Blue();}@Overridepublic Shape createShape() {return new Rectangle();}
}public class Main {public static void main(String[] args) {AbstractFactory redCircleFactory = new RedCircleFactory();Color red = redCircleFactory.createColor();red.fill();Shape circle = redCircleFactory.createShape();circle.draw();AbstractFactory blueRectangleFactory = new BlueRectangleFactory();Color blue = blueRectangleFactory.createColor();blue.fill();Shape rectangle = blueRectangleFactory.createShape();rectangle.draw();}
}
2. 結構型模式
2.1 適配器模式(Adapter Pattern)
適配器模式將一個類的接口轉換為客戶端所期望的另一個接口。它可以讓原本不兼容的類合作無間。
示例代碼:
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 {@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file: " + fileName);}@Overridepublic void playMp4(String fileName) {// Do nothing}
}public class Mp4Player implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {// Do nothing}@Overridepublic 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();}}@Overridepublic 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;@Overridepublic void play(String audioType, String fileName) {// 播放 mp3 音樂文件的內置支持if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing mp3 file: " + fileName);}// 使用 MediaAdapter 來播放其他文件格式的音樂文件else if (audioType.equalsIgnoreCase("vlc")|| audioType.equalsIgnoreCase("mp4")) {mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);}else {System.out.println("Invalid media. " + audioType + " format not supported");}}
}public class Main {public static void main(String[] args) {MediaPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "song.mp3");audioPlayer.play("vlc", "movie.vlc");audioPlayer.play("mp4", "video.mp4");audioPlayer.play("avi", "movie.avi");}
}
2.2 裝飾器模式(Decorator Pattern)
裝飾器模式動態地給一個對象添加一些額外的職責,同時又不改變其結構。
示例代碼:
public interface Car {void assemble();
}public class BasicCar implements Car {@Overridepublic void assemble() {System.out.println("Basic Car.");}
}public abstract class CarDecorator implements Car {protected Car decoratedCar;public CarDecorator(Car decoratedCar){this.decoratedCar = decoratedCar;}public void assemble(){decoratedCar.assemble();}
}public class SportsCar extends CarDecorator {public SportsCar(Car decoratedCar) {super(decoratedCar);}@Overridepublic void assemble(){super.assemble();System.out.println("Adding features of Sports Car.");}
}public class LuxuryCar extends CarDecorator {public LuxuryCar(Car decoratedCar) {super(decoratedCar);}@Overridepublic void assemble(){super.assemble();System.out.println("Adding features of Luxury Car.");}
}public class Main {public static void main(String[] args) {Car basicCar = new BasicCar();Car sportsCar = new SportsCar(basicCar);sportsCar.assemble();Car luxurySportsCar = new LuxuryCar(new SportsCar(basicCar));luxurySportsCar.assemble();}
}
3. 行為型模式
3.1 觀察者模式(Observer Pattern)
觀察者模式定義了對象之間的一對多依賴關系,當一個對象狀態發生改變時,其相關依賴對象都會收到通知并自動更新。
示例代碼:
import java.util.ArrayList;
import java.util.List;interface Observer {void update(String message);
}class User implements Observer {private final String name;User(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received message: " + message);}
}interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);
}class NewsAgency implements Subject {private final List<Observer> observers;private String news;NewsAgency() {this.observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}public void setNews(String news) {this.news = news;notifyObservers(news);}
}class Main {public static void main(String[] args) {NewsAgency newsAgency = new NewsAgency();User user1 = new User("User 1");User user2 = new User("User 2");newsAgency.registerObserver(user1);newsAgency.registerObserver(user2);newsAgency.setNews("Breaking news!");newsAgency.removeObserver(user2);newsAgency.setNews("Important news!");}
}
3.2 策略模式(Strategy Pattern)
策略模式定義了一系列算法,將每個算法封裝起來,使它們可以互相替換,使得算法可以獨立于使用它的客戶端而變化。
示例代碼:
interface PaymentStrategy {void pay(double amount);
}class CreditCardStrategy implements PaymentStrategy {private final String name;private final String cardNumber;private final String cvv;private final String dateOfExpiry;CreditCardStrategy(String name, String cardNumber, String cvv, String dateOfExpiry) {this.name = name;this.cardNumber = cardNumber;this.cvv = cvv;this.dateOfExpiry = dateOfExpiry;}@Overridepublic void pay(double amount) {System.out.println(amount + " paid with credit/debit card");}
}class PayPalStrategy implements PaymentStrategy {private final String emailId;private final String password;PayPalStrategy(String emailId, String password) {this.emailId = emailId;this.password = password;}@Overridepublic void pay(double amount) {System.out.println(amount + " paid using PayPal.");}
}class ShoppingCart {private final List<Item> items;ShoppingCart() {this.items = new ArrayList<>();}void addItem(Item item) {items.add(item);}double calculateTotal() {double total = 0;for (Item item : items) {total += item.getPrice();}return total;}void pay(PaymentStrategy paymentStrategy) {double amount = calculateTotal();paymentStrategy.pay(amount);}
}class Item {private final String name;private final double price;Item(String name, double price) {this.name = name;this.price = price;}double getPrice() {return price;}
}class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();Item item1 = new Item("Item 1", 20);Item item2 = new Item("Item 2", 30);cart.addItem(item1);cart.addItem(item2);cart.pay(new CreditCardStrategy("John Doe", "1234567890123456", "123", "12/2025"));cart.pay(new PayPalStrategy("john.doe@example.com", "password"));}
}
以上是一些常見的Java設計模式,每種設計模式都有不同的應用場景和用途。使用這些設計模式可以提高代碼的可維護性、可擴展性和重用性。
往期專欄 |
---|
Java全棧開發 |
數據結構與算法 |
計算機組成原理 |
操作系統 |
數據庫系統 |
物聯網控制原理與技術 |