設計模式分為哪三大類

在軟體開發過程中,設計模式是一種解決特定問題的經驗總結和最佳實踐。設計模式可以被分為三大類:創建型模式、結構型模式、行為型模式。接下來我們將從不同的角度詳細介紹這三大類設計模式。

一、創建型模式

創建型模式主要關注對象的創建過程,在對象的創建過程中封裝複雜性,並提供靈活的方式創建對象。創建型模式包括以下幾種模式:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ETIMX的頭像ETIMX
上一篇 2025-02-15 17:09
下一篇 2025-02-15 17:09

相關推薦

  • 手機安全模式怎麼解除?

    安全模式是一種手機自身的保護模式,它會禁用第三方應用程序並使用僅限基本系統功能。但有時候,安全模式會使你無法使用手機上的一些重要功能。如果你想解除手機安全模式,可以嘗試以下方法: …

    編程 2025-04-28
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • 顯示C++設計模式

    本文將詳細介紹顯示C++設計模式的概念、類型、優點和代碼實現。 一、概念 C++設計模式是在軟體設計階段定義,用於處理常見問題的可重用解決方案。這些解決方案是經過測試和驗證的,並已…

    編程 2025-04-27
  • Centos7進入單用戶模式的解釋

    本文將介紹如何在Centos7中進入單用戶模式,並從以下幾個方面進行詳細的闡述。 一、Centos7進入單用戶模式的解答 在Centos7中進入單用戶模式需要執行以下步驟: 1. …

    編程 2025-04-27
  • 深入解析PSM模式

    一、PSM模式是什麼 PSM模式,即頁面-狀態-模型模式,是一種前端開發模式。它以頁面為中心,將頁面內的所有狀態和業務邏輯抽象成一個由頁面轉化而來的虛擬狀態機模型,從而將業務邏輯與…

    編程 2025-04-25
  • 授權碼模式與OAuth2.0

    一、什麼是授權碼模式 授權碼模式(Authorization Code Grant Type)是OAuth2.0協議中最常用的授權方式之一,也是最為安全的一種授權方式。授權碼模式的…

    編程 2025-04-24
  • 從多個方面詳細闡述MVC模式和三層架構

    一、MVC模式 MVC是Model-View-Controller的縮寫,是一種應用於軟體工程的設計模式。MVC模式將一個軟體應用分為三個基本部分:模型(Model)、視圖(Vie…

    編程 2025-04-24
  • 暗黑模式的盛行

    一、背景和定義 暗黑模式起源於智能手錶和夜視儀等專業設備上的配色方案,是指採用黑底白字、暗灰底白字等相對較暗的背景色搭配亮色前景,以減少屏幕對用戶眼睛的刺激,降低視覺疲勞感。這種設…

    編程 2025-04-24
  • 谷歌瀏覽器深色模式

    一、深色模式的概念 深色模式是一種日益流行的 UI 設計趨勢,通過使用暗灰色或黑色背景,大大降低了屏幕的亮度,更加舒適和護眼。深色模式也被稱為暗黑模式。 谷歌瀏覽器深色模式的推出可…

    編程 2025-04-24
  • 單例模式的作用

    一、概念解釋 1、單例模式是指一個類只允許存在一個實例對象,且該對象能被系統中其他模塊所共用。該模式主要解決了全局變數的問題,在同一時間只有一個實例被使用,避免了多次重複實例化造成…

    編程 2025-04-23

發表回復

登錄後才能評論