JavaRush /จาวาบล็อก /Random-TH /กลยุทธ์เทมเพลต (กลยุทธ์)

กลยุทธ์เทมเพลต (กลยุทธ์)

เผยแพร่ในกลุ่ม
รูปแบบกลยุทธ์จะกำหนดกลุ่มอัลกอริธึม ห่อหุ้มแต่ละอัลกอริธึม และทำให้มั่นใจว่าสามารถใช้แทนกันได้ อนุญาตให้แก้ไขอัลกอริธึมโดยอิสระจากการใช้งานบนฝั่งไคลเอ็นต์ (คำจำกัดความนี้นำมาจากหนังสือ “Head First. Design Patterns” โดย Eric Freeman และ Elizabeth Robson) คำจำกัดความนี้ดูน่าสับสนเล็กน้อย ดังนั้นเราจึงจำเป็นต้อง อธิบายคำจำกัดความนี้โดยละเอียดมากขึ้น ในภาษาปกติ มาเริ่มกันที่ศาสนากันดีกว่า :) ในโลกนี้มีหลายศาสนา (คำสารภาพ การเคลื่อนไหว ความเชื่อ ฯลฯ) เราจะอธิบายสิ่งนี้ด้วยโค้ดได้อย่างไร ตัวอย่างเช่น เราสามารถเข้าเรียนกลุ่มศาสนาและสืบทอดศาสนาอื่นจากกลุ่มนั้นได้ มาสรุปสิ่งที่ไม่จำเป็นออกไปแล้วใช้วิธี believe() หนึ่งวิธีในคลาส Religion
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
ศาสนาอื่น ๆ ทั้งหมดสามารถสืบทอดได้จากคลาสนี้ ถ้าเราจำกัดตัวเองอยู่แค่ศาสนาคริสต์และแม้แต่ศาสนาอิสลามและศาสนายิวก็จะไม่มีปัญหา
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
แต่ถ้าคุณคิดถึงศาสนาอื่นที่มีอยู่ตอนนี้ (หรือเคยมีมาก่อนแต่หายไป) ปัญหาก็จะเกิดขึ้นอย่างน้อยกับชาวพุทธ คุณจะต้องแทนที่วิธีการเชื่อของพวกเขา
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
และเนื่องจากมีหลายศาสนาและพวกเขายังเชื่อในสัตว์ประหลาดพาสต้า (ลัทธิพาสต้าฟาเรียน) ดังนั้นในทุกศาสนาเหล่านี้ คุณจะต้องกำหนดวิธีการเชื่อใหม่ แต่เราจะทำมันแตกต่างออกไปได้ไหม โดยย้ายเมธอดนี้ไปที่อินเทอร์เฟซ Faith และนำเมธอด Believe ไปประยุกต์ใช้ และนำเมธอดนี้ไปใช้ในแต่ละคลาส (และปรับใช้ในแต่ละคลาสตามที่เราต้องการ) แต่แล้วเราก็จะได้รับโค้ดที่ซ้ำกัน อย่างน้อยก็ในหมู่ชาวยิวและคริสเตียน ชาวมุสลิมของพระเจ้าสามารถเขียนเป็นภาษาอาหรับได้
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("Я верю в Бога-творца этого мира");
    }
}
การใช้วิธีเริ่มต้นจะไม่ช่วยอะไรมากที่นี่ มีศาสนามากมายที่แม้ว่าคุณจะกำหนดวิธีนี้เป็นค่าเริ่มต้นในส่วนติดต่อศรัทธา คุณจะต้องใช้วิธีนี้ในแบบของคุณเองในทุกศาสนาที่ไม่นับถือพระเจ้าองค์เดียว และทำซ้ำอีกครั้ง ที่ไหนสักแห่ง. รูปแบบกลยุทธ์เสนออะไรให้เราในกรณีนี้: เสนอให้สร้างคลาสเทมเพลตสำเร็จรูปสำหรับอินเทอร์เฟซปัจจุบัน ซึ่งจะถูกแทนที่เป็นตัวสร้างของศาสนาเฉพาะ เหล่านั้น. กำหนดและสร้างอัลกอริธึมตระกูลเดียวกันกับที่กล่าวถึงในตอนต้นของคำจำกัดความ
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("Да пребудет с вами Сила!");
    }
}
และในแต่ละคลาสในตัวสร้าง ให้แทนที่พวกมัน
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();
    }
}
ดังนั้น หากคุณต้องการรวมศาสนาอื่นในโครงการของคุณ คุณจะไม่ต้องกำหนดวิธีการเชื่อใหม่สำหรับทุกคลาสหรือบางส่วนของคลาส และคุณจะต้องใช้คลาสที่ขาดหายไปเท่านั้น (หากไม่มีอยู่แล้ว) ที่ใช้อินเทอร์เฟซ Faith และเพิ่มคลาสนี้ในตัวสร้างของศาสนาใหม่
public class PastafarianismReligion implements Faith{

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

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION