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

Strategi Templat (Strategi)

Diterbitkan dalam kumpulan
Corak Strategi mentakrifkan keluarga algoritma, merangkum setiap satu daripadanya dan memastikan bahawa ia boleh ditukar ganti. Ia membenarkan algoritma diubah suai secara bebas daripada penggunaannya di sisi pelanggan (takrifan ini diambil daripada buku "Kepala Didahulukan. Corak Reka Bentuk" oleh Eric Freeman dan Elizabeth Robson). Takrifan ini kelihatan sedikit mengelirukan, jadi kita perlu menerangkan definisi ini dengan lebih terperinci dalam bahasa biasa . Mari kita mulakan dengan agama :) Terdapat banyak agama di dunia (pengakuan, pergerakan, kepercayaan, dll.). Bagaimana kita boleh menerangkan ini dalam kod. Sebagai contoh, kita boleh mengambil kelas Agama dan mewarisi agama lain daripadanya. Mari kita hapuskan perkara yang tidak perlu dan gunakan kaedah one believe() dalam kelas Agama.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Semua agama lain boleh diwarisi dari kelas ini. Jika kita telah menghadkan diri kita kepada Kristian dan juga Islam dan Yahudi, maka tidak akan ada masalah.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Tetapi jika anda berfikir tentang agama lain yang wujud sekarang (atau wujud sebelum ini, tetapi hilang), maka masalah akan timbul, sekurang-kurangnya dengan penganut Buddha. Anda perlu mengatasi kaedah kepercayaan mereka.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
Dan kerana terdapat banyak agama dan mereka juga percaya kepada raksasa pasta (Pastafarianisme), maka dalam semua agama ini anda perlu mentakrifkan semula kaedah percaya. Tetapi bolehkah kita melakukannya secara berbeza, mengalihkan kaedah ini ke antara muka Iman dan melaksanakan kaedah percaya di dalamnya dan melaksanakan kaedah ini dalam setiap kelas (dan sewajarnya melaksanakannya dalam setiap kelas seperti yang kita mahu)? Tetapi kemudian kita akan mendapat duplikasi kod, baik, sekurang-kurangnya di kalangan orang Yahudi dan Kristian. Umat ​​Islam Allah boleh 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("Я верю в Бога-творца этого мира");
    }
}
Melaksanakan kaedah lalai tidak akan banyak membantu di sini; terdapat begitu banyak agama yang walaupun anda mentakrifkan kaedah ini secara lalai dalam antara muka Iman, anda perlu melaksanakan kaedah ini dengan cara anda sendiri dalam semua agama bukan monoteistik, dan mengulanginya. di suatu tempat. Apakah yang ditawarkan oleh corak Strategi kepada kami dalam kes ini: ia menawarkan untuk mencipta kelas templat siap sedia untuk antara muka semasa, yang kemudiannya akan digantikan kepada pembina agama tertentu. Itu. tentukan dan cipta keluarga algoritma yang sama yang telah disebutkan pada permulaan 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 dalam setiap kelas dalam pembina, gantikannya.
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();
    }
}
Oleh itu, jika anda perlu memasukkan agama lain dalam projek anda, anda tidak perlu mentakrifkan semula kaedah percaya untuk semua kelas atau bahagian kelas. Dan anda hanya perlu melaksanakan kelas yang hilang (jika tiada lagi) yang melaksanakan antara muka Iman dan menambah kelas ini dalam pembina agama baharu.
public class PastafarianismReligion implements Faith{

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

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