在軟體開發過程中,設計模式是一種解決特定問題的經驗總結和最佳實踐。設計模式可以被分為三大類:創建型模式、結構型模式、行為型模式。接下來我們將從不同的角度詳細介紹這三大類設計模式。
一、創建型模式
創建型模式主要關注對象的創建過程,在對象的創建過程中封裝複雜性,並提供靈活的方式創建對象。創建型模式包括以下幾種模式:
1. 工廠方法模式
工廠方法模式定義一個用於創建對象的介面,讓子類決定將哪一個類實例化。可以將需要創建的對象類型從具體工廠的實現中解耦出來,使得代碼更加靈活。以下是工廠方法模式的示例代碼:
interface Car { void run(); } class Benz implements Car { @Override public void run() { System.out.println("Benz is running"); } } class BMW implements Car { @Override public void run() { System.out.println("BMW is running"); } } interface CarFactory { Car createCar(); } class BenzFactory implements CarFactory { @Override public Car createCar() { return new Benz(); } } class BMWFactory implements CarFactory { @Override public Car createCar() { return new BMW(); } } public class Main { public static void main(String[] args) { CarFactory factory = new BenzFactory(); Car car = factory.createCar(); car.run(); } }
2. 抽象工廠模式
抽象工廠模式提供一個用於創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。抽象工廠可以為用戶提供一組對象,這組對象的實現可以有多種選擇,基於用戶的需求而變化。以下是抽象工廠模式的示例代碼:
interface Engine { void start(); } interface Wheel { void roll(); } interface CarFactory { Engine createEngine(); Wheel createWheel(); } class BenzEngine implements Engine { @Override public void start() { System.out.println("Benz engine start"); } } class BMWEngine implements Engine { @Override public void start() { System.out.println("BMW engine start"); } } class BenzWheel implements Wheel { @Override public void roll() { System.out.println("Benz wheel roll"); } } class BMWWheel implements Wheel { @Override public void roll() { System.out.println("BMW wheel roll"); } } class BenzFactory implements CarFactory { @Override public Engine createEngine() { return new BenzEngine(); } @Override public Wheel createWheel() { return new BenzWheel(); } } class BMWFactory implements CarFactory { @Override public Engine createEngine() { return new BMWEngine(); } @Override public Wheel createWheel() { return new BMWWheel(); } } public class Main { public static void main(String[] args) { CarFactory factory = new BenzFactory(); Engine engine = factory.createEngine(); Wheel wheel = factory.createWheel(); engine.start(); wheel.roll(); } }
二、結構型模式
結構型模式主要關注對象的組合方式,通過對象間的類組合形成更大的結構,使得系統更加靈活和易於維護。結構型模式包括以下幾種模式:
1. 適配器模式
適配器模式將一個類的介面轉換為客戶希望的另外一個介面,適配器模式可以讓原本不兼容的類在一起工作。以下是適配器模式的示例代碼:
interface Electronic220V { void powerOn(); } class Outlet { public void powerOn(Electronic220V electronic220V) { electronic220V.powerOn(); } } class Electronic110V { public void powerOn() { System.out.println("Electronic110V is powered on"); } } class ElectronicAdapter implements Electronic220V { private Electronic110V electronic110V; public ElectronicAdapter(Electronic110V electronic110V) { this.electronic110V = electronic110V; } @Override public void powerOn() { electronic110V.powerOn(); } } public class Main { public static void main(String[] args) { Electronic110V electronic110V = new Electronic110V(); ElectronicAdapter adapter = new ElectronicAdapter(electronic110V); Outlet outlet = new Outlet(); outlet.powerOn(adapter); } }
2. 裝飾器模式
裝飾器模式可以動態地給一個對象添加一些額外的職責,同時又不改變其結構。裝飾器模式可以實現設計要求開放閉合原則(Open–Closed Principle),即軟體實體應該對擴展開放,對修改關閉。以下是裝飾器模式的示例代碼:
interface Shape { void draw(); } class Circle implements Shape { @Override public void draw() { System.out.println("Draw a circle"); } } class Square implements Shape { @Override public void draw() { System.out.println("Draw a square"); } } abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape) { this.decoratedShape = decoratedShape; } @Override public void draw() { decoratedShape.draw(); } } class RedBorderDecorator extends ShapeDecorator { public RedBorderDecorator(Shape decoratedShape) { super(decoratedShape); } @Override public void draw() { decoratedShape.draw(); System.out.println("Add a red border"); } } public class Main { public static void main(String[] args) { Shape circle = new Circle(); Shape redCircle = new RedBorderDecorator(circle); Shape redSquare = new RedBorderDecorator(new Square()); circle.draw(); redCircle.draw(); redSquare.draw(); } }
三、行為型模式
行為型模式主要關注對象間的通信方式和通信協議,通過定義對象間的交互進行協同工作,從而完成特定的功能。行為型模式包括以下幾種模式:
1. 觀察者模式
觀察者模式定義了一個一對多的依賴關係,當對象狀態發生改變時,所有依賴它的對象都會收到通知並自動更新。以下是觀察者模式的示例代碼:
import java.util.ArrayList; import java.util.List; interface Observer { void update(); } class Subject { private List observers = new ArrayList(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } class ConcreteObserver implements Observer { private String name; private Subject subject; public ConcreteObserver(String name, Subject subject) { this.name = name; this.subject = subject; } @Override public void update() { System.out.println(name + " received notification"); } } public class Main { public static void main(String[] args) { Subject subject = new Subject(); Observer observer1 = new ConcreteObserver("Observer1", subject); Observer observer2 = new ConcreteObserver("Observer2", subject); Observer observer3 = new ConcreteObserver("Observer3", subject); subject.attach(observer1); subject.attach(observer2); subject.attach(observer3); subject.notifyObservers(); } }
2. 命令模式
命令模式將請求封裝成對象,以便解耦發送者和接收者。命令模式中包含的對象有:請求者、接收者、命令對象和客戶端。以下是命令模式的示例代碼:
interface Command { void execute(); } class Receiver { public void action() { System.out.println("Action"); } } class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { receiver.action(); } } class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } public class Main { public static void main(String[] args) { Receiver receiver = new Receiver(); ConcreteCommand command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(); invoker.setCommand(command); invoker.executeCommand(); } }
以上就是對設計模式分為哪三大類的講解,通過示例代碼加深了對每個模式的具體理解,希望對讀者有所幫助。
原創文章,作者:ETIMX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/349414.html