JavaRush /Java Blog /Random-TL /Diskarte sa Template (Diskarte)

Diskarte sa Template (Diskarte)

Nai-publish sa grupo
Tinutukoy ng pattern ng Strategy ang isang pamilya ng mga algorithm, isinasama ang bawat isa sa kanila, at tinitiyak na ang mga ito ay mapapalitan. Pinapayagan nito ang mga algorithm na mabago nang hiwalay sa kanilang paggamit sa panig ng kliyente (ang kahulugan na ito ay kinuha mula sa aklat na "Una ang ulo. Mga Pattern ng Disenyo" ni Eric Freeman at Elizabeth Robson). Mukhang medyo nakakalito ang kahulugang ito, kaya kailangan nating ipaliwanag ang kahulugang ito nang mas detalyado sa normal na wika . Magsimula tayo sa relihiyon :) Maraming relihiyon sa mundo (confessions, movements, beliefs, etc.). Paano natin ito mailalarawan sa code. Buweno, halimbawa, maaari nating kunin ang klase ng Relihiyon at magmana ng ibang mga relihiyon mula rito. Alisin natin ang mga hindi kinakailangang bagay at gumamit ng isang believe() method sa Religion class.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Lahat ng ibang relihiyon ay maaaring mamana mula sa klaseng ito. Kung nililimitahan natin ang ating sarili sa Kristiyanismo at maging ang Islam at Hudaismo, kung gayon ay walang mga problema.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Ngunit kung iisipin mo ang iba pang mga relihiyon na umiiral ngayon (o umiral noon, ngunit nawala), kung gayon ang mga problema ay babangon, hindi bababa sa mga Budista. Kailangan mong i-override ang kanilang paraan ng paniniwala.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
At dahil maraming relihiyon at naniniwala pa nga sila sa halimaw na pasta (Pastafarianism), sa lahat ng relihiyong ito kailangan mong muling tukuyin ang paraan ng paniniwala. Ngunit magagawa ba natin ito nang iba, ilipat ang pamamaraang ito sa interface ng Pananampalataya at ipatupad ang paraan ng paniniwala dito at ipatupad ang pamamaraang ito sa bawat klase (at naaayon na ipatupad ito sa bawat klase ayon sa gusto natin)? Ngunit pagkatapos ay makakakuha tayo ng pagdoble ng code, mabuti, hindi bababa sa mga Hudyo at Kristiyano. Ang mga Muslim ng Diyos ay maaaring sumulat sa Arabic.
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("Я верю в Бога-творца этого мира");
    }
}
Ang pagpapatupad ng default na pamamaraan ay hindi makakatulong dito; napakaraming relihiyon na kahit na tukuyin mo ang pamamaraang ito bilang default sa interface ng Pananampalataya, kakailanganin mong ipatupad ang pamamaraang ito sa iyong sariling paraan sa lahat ng hindi monoteistikong relihiyon, at ulitin ito. sa isang lugar. Ano ang inaalok sa amin ng pattern ng Strategy sa kasong ito: nag-aalok ito upang lumikha ng mga yari na klase ng template para sa kasalukuyang interface, na pagkatapos ay papalitan sa constructor ng isang partikular na relihiyon. Yung. tukuyin at lumikha ng parehong pamilya ng mga algorithm na nabanggit sa simula ng kahulugan.
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("Да пребудет с вами Сила!");
    }
}
At sa bawat klase sa constructor, palitan sila.
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();
    }
}
Kaya, kung kailangan mong magsama ng ibang relihiyon sa iyong proyekto, hindi mo na kailangang muling tukuyin ang paraan ng paniniwala para sa lahat ng klase o bahagi ng mga klase. At kakailanganin mo lang ipatupad ang nawawalang klase (kung wala pa) na nagpapatupad ng Faith interface at idagdag ang klase na ito sa constructor ng bagong relihiyon.
public class PastafarianismReligion implements Faith{

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

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