Kelas konteks dalam pola Strategi

10

Saya mencoba memahami pola strategi dan bertanya pada diri sendiri: apakah kelas konteks harus dimiliki atau dapatkah saya tinggalkan tanpa mengganggu tujuan pola?

Saya mendapat kesan bahwa saya memerlukan semacam saklar untuk membaca berbagai jenis file tetapi tidak ingin meretas sesuatu dan kemudian berurusan dengan refactoring (walaupun, tentu saja selalu terjadi bahwa kode dapat di refactored tetapi idenya adalah: coba menjadi sepintar mungkin dalam desain sebelumnya ...):

masukkan deskripsi gambar di sini

Gambar diambil dari wikimedia

Bisakah klien mendelegasikan secara langsung ke antarmuka Strategi atau ada sesuatu yang saya lewatkan untuk mengerti tentang kelas konteks?

interface Reader {
    // read information from file and fill data list field of Client
    readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}

class Client{
    // strategic choice
    Reader r;

    // data list field
    List<Data> data;

    // Client Constructor
    public Client(){
        if(<file ends in .xls>)
            r = new ExcelReader();
        else
            r = new PdfReader();
        r.readFile();
    }
}

Jadi, yang digambarkan di atas adalah konteks kelas yang hilang. Apakah kode mematuhi pola strategi?

panny
sumber
1
Sebagai poin lain yang menarik / penting saya ingin menarik perhatian Anda bahwa konsep kelas tipe dalam bahasa fungsional adalah "hanya" pola strategi dengan jenis en.wikipedia.org/wiki/Kind_(type_theory) ). Keduanya hanyalah mekanisme implementasi untuk polimorfisme ad-hoc.
AndreasScheinert
Apakah ini (jauh atau kurang) terkait dengan Java 8 Project Lambda? Artikel Wikipedia terlalu padat untuk saya pahami sekaligus, tetapi jika ini adalah bagian dari latar belakang teoritis untuk secara efisien menggunakan fitur Java yang akan datang (atau pemrograman pada umumnya), saya akan dengan senang hati menginvestasikan lebih banyak waktu di dalamnya.
Panny
1
Sangat jauh tapi saya berpendapat ya, kelas tipe perlu. Bahasa pemrograman yang mendukung jenis yang lebih tinggi. Itu akan menjadi kasus untuk scala dan Haskell. Maksud saya di sini adalah bahwa polimorfisme (ad hoc) diterapkan secara berbeda dan jika Anda mundur Anda dapat mempelajari beberapa wawasan tentang polimorfisme secara umum.
AndreasScheinert

Jawaban:

13

Dalam contoh Anda, panggilan kode readFileadalah bagian dari konstruktor Klien. Metode itu adalah "konteks" yang Anda cari . Pola strategi tidak memerlukan "kelas konteks" secara harfiah, dan pada versi pertama kode Anda objek strategi ("Pembaca" dalam kasus Anda) dapat berada hanya dalam variabel lokal. Terutama ketika hanya ada satu "metode strategis" ("readFile") untuk dipanggil.

Namun, jika basis kode Anda tumbuh dari satu versi ke versi berikutnya, bukan tidak mungkin semakin banyak metode "strategis" dipanggil, dan keputusan strategi mana yang akan diterapkan dan pelaksanaan "metode strategis" akan terjadi pada waktu yang berbeda. dan di berbagai tempat dalam kode Anda. Jadi Anda mulai memperbaiki mereka untuk menjaga logika di satu tempat. Ini akan mengarah langsung ke implementasi yang mirip dengan diagram di pertanyaan Anda.

Doc Brown
sumber
5

Pasti. Pola hanyalah pedoman. Anda masih perlu beradaptasi dan menerapkannya dengan benar untuk masalah yang dihadapi. Secara pribadi, saya jarang pernah membiarkan strategi diatur pada saat runtime; lebih sering ditentukan pada konstruksi atau diputar di pabrik.

Padahal bisa juga diperdebatkan bahwa setStrategyitu pribadi dan injeksi saya hanya menggunakan pola seperti yang ditunjukkan.

Telastyn
sumber
Apakah ini berarti menggambarkan kelas Konteks dapat ditinggalkan tanpa kompromi polanya? Atau dengan kata lain, apakah boleh ketika kelas klien saya adalah kelas konteks yang digambarkan?
Panny
6
@panny - Saya ragu-ragu untuk menjawab pertanyaan karena itu menunjukkan Anda telah melewatkan titik jawaban, dan memang pola sama sekali. Pola strategi memungkinkan Anda untuk memvariasikan perilaku dengan memasok berbagai implementasi konkret di belakang sebuah antarmuka. Itu adalah konsep , bukan formula .
Telastyn