Rumah > pembangunan bahagian belakang > Tutorial Python > Corak Reka Bentuk Strategi

Corak Reka Bentuk Strategi

Barbara Streisand
Lepaskan: 2024-11-27 15:05:12
asal
739 orang telah melayarinya

Strategy Design Pattern

Corak Reka Bentuk Strategi ialah corak reka bentuk gelagat yang membolehkan memilih gelagat algoritma pada masa jalan.

Daripada melaksanakan berbilang variasi algoritma dalam satu kelas, ia membolehkan anda menentukan keluarga algoritma, merangkum setiap satu dalam kelasnya sendiri dan menjadikannya boleh ditukar ganti.

Komponen Corak Strategi (UML):

  1. Kelas Konteks: Mengekalkan rujukan kepada objek Strategi dan berinteraksi dengannya melalui antara muka biasa.

    • Contoh: Kelas Pengguna berinteraksi dengan strategi berbeza untuk Kualiti dan AdPolicy.
  2. Antara Muka Strategi: Mentakrifkan antara muka biasa untuk semua strategi konkrit.

    • Contoh: Kualiti dan ADPolicies ialah antara muka abstrak yang menentukan tingkah laku.
  3. Strategi Konkrit: Laksanakan antara muka Strategi dengan algoritma tertentu.

    • Contoh: FreeUserQuality, PremiumUserQuality, BasicUserQuality, FreeUserAdPolicy, dll.

Bila Menggunakan Corak Strategi

Gunakan Corak Strategi apabila faedah fleksibiliti dan kebolehselenggaraan mengatasi overhed mengurus berbilang kelas strategi.

  1. Banyak Algoritma:

    • Apabila anda perlu menentukan berbilang variasi algoritma atau gelagat dalam satu kelas.
    • Contoh: Menentukan kualiti video untuk pelan langganan yang berbeza (Percuma, Asas, Premium).
  2. Keputusan Masa Jalan:

    • Apabila gelagat kelas perlu berubah secara dinamik berdasarkan input pengguna atau keadaan masa jalan lain.
    • Contoh: Memilih algoritma pemampatan (ZIP, RAR, 7z) pada masa jalan.
  3. Elakkan Penggunaan Berlebihan Pernyataan if atau switch:

    • Ganti logik bersyarat dengan kelas strategi boleh tukar ganti.
    • Contoh: Pemprosesan pembayaran (Kad Kredit, PayPal, UPI) tanpa sekatan if-else yang besar.
  4. Encapsulation of Variations:

    • Merangkum variasi algoritma dalam kelas berasingan untuk memastikan kelas konteks bersih.
    • Contoh: Strategi pengelogan (ConsoleLogger, FileLogger, RemoteLogger).
  5. Prinsip Terbuka/Tertutup:

    • Pastikan sistem dibuka untuk sambungan tetapi ditutup untuk pengubahsuaian dengan menambah strategi baharu tanpa mengubah kod sedia ada.
    • Contoh: Menambah jenis pengguna baharu (EnterpriseUserQuality) dalam sistem contoh.

Contoh:

from abc import ABC, abstractmethod
from enum import Enum

# Enum for User Types
class UserType(Enum):
    FREE = 0
    BASIC = 1
    PREMIUM = 2

# Strategy Interface for Quality
class Quality(ABC):
    @abstractmethod
    def get_quality(self):
        pass

# Strategy Interface for Ad Policy
class AdPolicy(ABC):
    @abstractmethod
    def has_ads(self):
        pass

# Concrete Strategy for Quality
class FreeUserQuality(Quality):
    def get_quality(self):
        return ['SD']

class BasicUserQuality(Quality):
    def get_quality(self):
        return ['SD', 'HD']

class PremiumUserQuality(Quality):
    def get_quality(self):
        return ['SD', 'HD', 'UHD']

# Concrete Strategy for Ad Policy
class FreeUserAdPolicy(AdPolicy):
    def has_ads(self):
        return True

class BasicUserAdPolicy(AdPolicy):
    def has_ads(self):
        return True

class PremiumUserAdPolicy(AdPolicy):
    def has_ads(self):
        return False

# Context Class
class User:
    def __init__(self, user_type: UserType, quality: Quality, ad_policy: AdPolicy):
        self.user_type = user_type
        self.quality = quality
        self.ad_policy = ad_policy

    def get_quality(self):
        return self.quality.get_quality()

    def has_ads(self):
        return self.ad_policy.has_ads()

# Usage
free_user = User(UserType.FREE, FreeUserQuality(), FreeUserAdPolicy())
basic_user = User(UserType.BASIC, BasicUserQuality(), BasicUserAdPolicy())
premium_user = User(UserType.PREMIUM, PremiumUserQuality(), PremiumUserAdPolicy())

print("Free User Quality:", free_user.get_quality())  # ['SD']
print("Free User Ads:", free_user.has_ads())          # True

print("Premium User Quality:", premium_user.get_quality())  # ['SD', 'HD', 'UHD']
print("Premium User Ads:", premium_user.has_ads())          # False
Salin selepas log masuk

Kelebihan Corak Strategi:

  1. Fleksibiliti: Algoritma boleh ditukar pada masa jalan tanpa mengubah kelas konteks.
  2. Kebolehluasan: Strategi baharu boleh ditambah tanpa mengubah suai kod sedia ada.
  3. Kebolehbacaan dan Penyelenggaraan: Mengurangkan kekacauan dalam kelas utama dengan mewakilkan logik kepada kelas strategi tertentu.
  4. Pematuhan kepada Prinsip SOLID: Terutamanya menyokong Prinsip Terbuka/Tertutup.

Kelemahan Corak Strategi:

  1. Meningkatkan Kerumitan: Memperkenalkan kelas dan objek tambahan untuk diurus.
  2. Overhed: Jika bilangan strategi adalah kecil atau jarang ditukar, corak mungkin menambah kerumitan yang tidak perlu.

Contoh Tambahan

  1. Algoritma Isih: Menggunakan strategi pengisihan yang berbeza (cth., QuickSort, MergeSort, BubbleSort) secara dinamik.
  2. Pengiraan Diskaun: Menggunakan strategi diskaun yang berbeza (Diskaun Rata, Diskaun Peratus) berdasarkan jenis pengguna.
  3. Mekanisme Pengesahan: Bertukar antara kaedah pengesahan yang berbeza (OAuth, JWT, BasicAuth).

Atas ialah kandungan terperinci Corak Reka Bentuk Strategi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan