在軟件開發過程中,設計模式是一種解決特定問題的經驗總結和最佳實踐。設計模式可以被分為三大類:創建型模式、結構型模式、行為型模式。接下來我們將從不同的角度詳細介紹這三大類設計模式。
一、創建型模式
創建型模式主要關注對象的創建過程,在對象的創建過程中封裝複雜性,並提供靈活的方式創建對象。創建型模式包括以下幾種模式:
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-hk/n/349414.html
微信掃一掃
支付寶掃一掃