JavaRush /จาวาบล็อก /Random-TH /รูปแบบการออกแบบสะพาน

รูปแบบการออกแบบสะพาน

เผยแพร่ในกลุ่ม
สวัสดี! เรายังคงเข้าใจหัวข้อที่กว้างและมีประโยชน์มากอย่างต่อเนื่อง - รูปแบบการออกแบบ วันนี้เราจะมาพูดถึงบริดจ์ เช่นเดียวกับรูปแบบอื่นๆ Bridge ทำหน้าที่แก้ไขปัญหาทั่วไปที่นักพัฒนาต้องเผชิญเมื่อออกแบบสถาปัตยกรรมซอฟต์แวร์ วันนี้เรามาศึกษาคุณสมบัติของมันและดูวิธีใช้งานกันดีกว่า

รูปแบบสะพานคืออะไร?

ลายสะพานเป็นลายการออกแบบโครงสร้าง นั่นคือหน้าที่หลักคือการสร้างโครงสร้างคลาสและอ็อบเจ็กต์ที่ครบถ้วน Bridge แก้ปัญหานี้ด้วยการแบ่งคลาส ตั้งแต่หนึ่งคลาสขึ้นไปออกเป็นลำดับชั้นที่แยกจากกัน - นามธรรมและการใช้งาน การเปลี่ยนแปลงฟังก์ชันการทำงานในลำดับชั้นหนึ่งไม่ได้นำมาซึ่งการเปลี่ยนแปลงในอีกลำดับชั้นหนึ่ง ทุกอย่างดูเหมือนชัดเจน แต่จริงๆ แล้ว คำจำกัดความนี้ฟังดูกว้างมาก และไม่ตอบคำถามหลัก: "รูปแบบ Bridge คืออะไร" ฉันคิดว่านี่จะง่ายกว่าสำหรับคุณที่จะเข้าใจในทางปฏิบัติ เรามาสร้างตัวอย่างคลาสสิกสำหรับรูปแบบ Bridge กันทันที เรามีคลาสนามธรรมShapeที่โดยทั่วไปจะอธิบายรูปทรงเรขาคณิต:
  • รูปร่าง.java

    public abstract class Shape {
       public abstract void draw();
    }

    เมื่อเราตัดสินใจที่จะเพิ่มรูปร่างสามเหลี่ยมและสี่เหลี่ยมผืนผ้า เราจะสืบทอดมาจากคลาสShape:

  • สี่เหลี่ยมผืนผ้า.java:

    public class Rectangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
       }
    }
  • สามเหลี่ยม.java:

    public class Triangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing triangle");
       }
    }
ทุกอย่างดูเรียบง่ายจนกระทั่งเราแนะนำแนวคิดเรื่อง "สี" นั่นคือแต่ละรูปจะมีสีของตัวเองซึ่งจะขึ้นอยู่กับฟังก์ชันการทำงานของวิธีการdraw(). เพื่อให้มีการใช้เมธอดที่แตกต่างกันdraw()เราจำเป็นต้องสร้างคลาสสำหรับแต่ละรูปร่างที่สอดคล้องกับสี หากมีสามสี ก็จะมีหกคลาส: TriangleBlack, TriangleGreen, TriangleRed, RectangleBlackและ หกชั้นเรียนไม่ใช่เรื่องใหญ่อะไร แต่! หากเราจำเป็นต้องเพิ่มรูปร่างหรือสีใหม่ จำนวนคลาสจะเพิ่มขึ้นแบบทวีคูณ จะออกจากสถานการณ์นี้ได้อย่างไร? การจัดเก็บสีในช่องและลองใช้ตัวเลือกแบบมีเงื่อนไขไม่ใช่ทางออกที่ดีที่สุด ทางออกที่ดีคือการแสดงสีในอินเทอร์เฟซที่แยกจากกัน อย่าเพิ่งพูดแต่ทำ : มาสร้างอินเทอร์เฟซและการใช้งานสามอย่าง - และ:RectangleGreenRectangleRedColorBlackColorGreenColorRedColor
  • Color.java:

    public interface Color {
       void fillColor();
    }
  • BlackColor.java:

    public class BlackColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in black color");
       }
    }
  • GreenColor.java

    public class GreenColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in green color");
       }
    }
  • RedColor.java

    public class RedColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in red color");
       }
    }

    ตอนนี้เรามาเพิ่มฟิลด์ประเภทColorให้กับคลาสShape- เราจะได้รับค่าของมันในตัวสร้าง

  • รูปร่าง.java:

    public abstract class Shape {
       protected Color color;
    
       public Shape(Color color) {
           this.color = color;
       }
    
       public abstract void draw();
    }

    colorเราจะใช้ตัวแปร ในการนำไป Shapeใช้ งาน ซึ่งหมายความว่ารูปร่างสามารถใช้ฟังก์ชันการทำงานของอินเทอร์เฟซได้Colorแล้ว

  • สี่เหลี่ยมผืนผ้า.java

    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
เอาล่ะ! ตอนนี้เราสามารถสร้างสีและรูปทรงเรขาคณิตที่แตกต่างกันได้แม้กระทั่งไม่จำกัด ซึ่งเป็นการเพิ่มจำนวนคลาสในการก้าวหน้าทางคณิตศาสตร์ ฟิลด์นี้Color colorเป็นสะพานที่เชื่อมต่อระหว่างสองลำดับชั้นที่แยกจากกัน

อุปกรณ์บริดจ์: สิ่งที่เป็นนามธรรมและการนำไปปฏิบัติ

มาดูคลาสไดอะแกรมที่อธิบายรูปแบบบริดจ์กัน: ความรู้เบื้องต้นเกี่ยวกับรูปแบบการออกแบบสะพาน - 2ที่นี่คุณจะเห็นโครงสร้างอิสระสองโครงสร้างที่สามารถแก้ไขได้โดยไม่กระทบต่อฟังก์ชันการทำงานของกันและกัน ในกรณีของเราคือ:
  • นามธรรม - ระดับShape;
  • RefinedAbstraction - คลาสTriangle, Rectangle;
  • ผู้ดำเนินการ - อินเทอร์เฟซColor;
  • ConcreteImplementor - คลาสBlackColorและGreenColor.RedColor
คลาสนี้Shapeแสดงถึงนามธรรม - กลไกในการควบคุมสีของรูปร่างในสีที่ต่างกัน ซึ่งมอบหมายการดำเนินการให้กับอินเทอร์เฟColorซ คลาสTriangleเป็นRectangleวัตถุจริงที่ใช้กลไกที่นำเสนอโดยShapeคลาส BlackColorและGreenColor- RedColorการใช้งานเฉพาะในสาขาการดำเนินงาน มักเรียกว่าแพลตฟอร์ม

รูปแบบ Bridge ใช้ที่ไหน?

ข้อได้เปรียบอย่างมากของการใช้รูปแบบนี้คือ คุณสามารถเปลี่ยนแปลงฟังก์ชันการทำงานของคลาสในสาขาหนึ่งได้โดยไม่ทำลายตรรกะของอีกสาขาหนึ่ง วิธีนี้ยังช่วยลดการเชื่อมโยงคลาสของโปรแกรมอีกด้วย เงื่อนไขหลักในการใช้รูปแบบคือ "ทำตามคำแนะนำ": อย่าติดไว้ที่ใดก็ได้! ที่จริงแล้ว เรามาดูกันว่าในกรณีใดบ้างที่คุณต้องใช้ Bridge อย่างแน่นอน:
  1. หากจำเป็นต้องขยายจำนวนเอนทิตีในสองทิศทาง (รูปทรงเรขาคณิต, สี)

  2. หากคุณต้องการแบ่งชั้นเรียนขนาดใหญ่ที่ไม่ตรงตามหลักความรับผิดชอบเดี่ยวออกเป็นชั้นเรียนย่อยที่มีฟังก์ชันการทำงานแบบแคบ

  3. หากมีความจำเป็นต้องเปลี่ยนแปลงลอจิกของการดำเนินการของเอนทิตีบางอย่างในขณะที่โปรแกรมกำลังทำงานอยู่

  4. หากจำเป็น ให้ซ่อนการใช้งานจากไคลเอ็นต์คลาส (ไลบรารี)

เมื่อใช้รูปแบบในแต่ละครั้ง คุณต้องจำไว้ว่ารูปแบบนั้นจะเพิ่มเอนทิตีเพิ่มเติมให้กับโค้ด - การใช้รูปแบบนั้นในโปรเจ็กต์ที่มีรูปทรงเรขาคณิตเพียงรูปเดียวและสีที่เป็นไปได้หนึ่งหรือสองสีนั้นไม่สมเหตุสมผลเลย

ข้อดีและข้อเสียของรูปแบบ

เช่นเดียวกับรูปแบบอื่นๆ Bridge มีทั้งข้อดีและข้อเสีย ประโยชน์ของสะพาน:
  1. ปรับปรุงความสามารถในการปรับขนาดโค้ด - คุณสามารถเพิ่มฟังก์ชันการทำงานโดยไม่ต้องกลัวว่าจะทำให้บางสิ่งบางอย่างเสียหายในส่วนอื่นของโปรแกรม
  2. ลดจำนวนคลาสย่อย - ใช้งานได้เมื่อจำเป็นต้องขยายจำนวนเอนทิตีในสองทิศทาง (เช่น จำนวนรูปร่างและจำนวนสี)
  3. ทำให้สามารถทำงานแยกกันใน Abstraction และ Implementation สองสาขาแยกกัน ซึ่งนักพัฒนาสองคนสามารถทำได้โดยไม่ต้องเจาะลึกรายละเอียดของโค้ดของกันและกัน
  4. การลดการเชื่อมต่อของคลาส - สถานที่เดียวที่มีการเชื่อมต่อสองคลาสคือบริดจ์ (ฟิลด์Color color)
ข้อเสียของสะพาน:
  1. ขึ้นอยู่กับสถานการณ์เฉพาะและโครงสร้างของโครงการโดยรวม อาจมีผลกระทบด้านลบต่อประสิทธิภาพของโปรแกรม (ตัวอย่างเช่น หากจำเป็นต้องเตรียมใช้งานออบเจ็กต์เพิ่มเติม)
  2. ทำให้การอ่านโค้ดซับซ้อนขึ้นเนื่องจากจำเป็นต้องนำทางระหว่างคลาสต่างๆ

ความแตกต่างจากรูปแบบกลยุทธ์

รูปแบบ Bridge มักจะสับสนกับรูปแบบการออกแบบอื่น นั่นคือ Strategy พวกเขาทั้งสองใช้การจัดองค์ประกอบ (ในตัวอย่างรูปร่างและสีที่เราใช้การรวมกลุ่ม แต่รูปแบบ Bridge ก็สามารถใช้การจัดองค์ประกอบได้) โดยการมอบหมายงานให้กับวัตถุอื่น แต่มีความแตกต่างระหว่างพวกเขาและมันใหญ่มาก รูปแบบกลยุทธ์เป็นรูปแบบพฤติกรรม: แก้ปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง กลยุทธ์ช่วยให้อัลกอริธึมสามารถใช้แทนกันได้ ในขณะที่ Bridge แยกสิ่งที่เป็นนามธรรมจากการนำไปปฏิบัติเพื่อให้มีตัวเลือกระหว่างการใช้งานที่แตกต่างกัน นั่นคือ Bridge ซึ่งต่างจาก Strategy ตรงที่ใช้กับโครงสร้างทั้งหมดหรือโครงสร้างแบบลำดับชั้น รูปแบบ Bridge อาจเป็นอาวุธที่ดีในคลังแสงของ Developer สิ่งสำคัญคือการค้นหาสถานการณ์ที่คุ้มค่าที่จะใช้มัน หรือใช้รูปแบบอื่น หากคุณยังไม่คุ้นเคยกับเทมเพลตอื่นๆ โปรดอ่านเอกสารเหล่านี้:
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION