JavaRush /Java Blog /Random-ID /Strategi Templat (Strategi)

Strategi Templat (Strategi)

Dipublikasikan di grup Random-ID
Pola Strategi mendefinisikan sekumpulan algoritme, merangkum masing-masing algoritme, dan memastikan bahwa algoritme tersebut dapat dipertukarkan. Hal ini memungkinkan algoritma untuk dimodifikasi secara independen dari penggunaannya di sisi klien (definisi ini diambil dari buku “Head First. Design Patterns” oleh Eric Freeman dan Elizabeth Robson). Definisi ini terlihat sedikit membingungkan, sehingga kita perlu menjelaskan definisi ini lebih detail dalam bahasa normal . Mari kita mulai dengan agama :) Ada banyak agama di dunia (pengakuan, gerakan, kepercayaan, dll). Bagaimana kita bisa menggambarkan hal ini dalam kode. Misalnya, kita bisa mengambil kelas Agama dan mewarisi agama lain darinya. Mari kita singkirkan hal-hal yang tidak perlu dan gunakan satu metode believe() di kelas Religion.

public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Semua agama lain dapat diwarisi dari kelas ini. Jika kita membatasi diri pada agama Kristen dan bahkan Islam dan Yudaisme, maka tidak akan ada masalah.

public class Judaism extends Religion {
}

public class Islam extends Religion {
}

public class Christianity extends Religion {
}
Namun jika memikirkan agama-agama lain yang ada saat ini (atau sudah ada sebelumnya, namun menghilang), maka akan muncul masalah, setidaknya dengan umat Buddha. Anda harus mengganti metode kepercayaan mereka.

public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
Dan karena ada banyak agama dan bahkan mereka percaya pada monster pasta (Pastafarianisme), maka di semua agama ini Anda harus mendefinisikan ulang metode kepercayaannya. Tapi bisakah kita melakukannya secara berbeda, memindahkan metode ini ke antarmuka Faith dan mengimplementasikan metode believe di dalamnya dan mengimplementasikan metode ini di setiap kelas (dan mengimplementasikannya di setiap kelas sesuai keinginan kita)? Tapi kemudian kita akan mendapatkan duplikasi kode, setidaknya di antara orang Yahudi dan Kristen. Muslim Tuhan dapat menulis dalam bahasa Arab.

public interface Faith {
    public void believe();
}

public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}

public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Menerapkan metode default tidak akan banyak membantu di sini; ada begitu banyak agama bahkan jika Anda mendefinisikan metode ini secara default di antarmuka Iman, Anda harus menerapkan metode ini dengan cara Anda sendiri di semua agama non-monoteistik, dan mengulanginya. suatu tempat. Apa yang ditawarkan oleh pola Strategi kepada kita dalam hal ini: ia menawarkan untuk membuat kelas templat siap pakai untuk antarmuka saat ini, yang kemudian akan diganti menjadi konstruktor agama tertentu. Itu. mendefinisikan dan membuat keluarga algoritma yang sama seperti yang disebutkan di awal definisi.

public interface Faith {
    public void believe();
}

public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}

public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    }
}

public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
Dan di setiap kelas di konstruktor, gantikan mereka.

public abstract class Religion {
    Faith faith;
}

public class Judaism extends Religion{
    
    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}

public class Christianity extends Religion{
    
    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}

public class Buddhism extends Religion {
    
    public Buddhism() {
        this.faith = new BuddismReligion();
    }   
}
Jadi, jika Anda perlu memasukkan agama lain ke dalam proyek Anda, Anda tidak perlu mendefinisikan ulang metode kepercayaan untuk semua kelas atau bagian kelas. Dan Anda hanya perlu mengimplementasikan kelas yang hilang (jika belum ada) yang mengimplementasikan antarmuka Faith dan menambahkan kelas ini di konstruktor agama baru.

public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}

public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION