CodeGym /จาวาบล็อก /สุ่ม /รูปแบบการออกแบบสะพาน
John Squirrels
ระดับ
San Francisco

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

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

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

รูปแบบสะพานเป็นรูปแบบการออกแบบโครงสร้าง กล่าวอีกนัยหนึ่ง งานหลักของมันคือการสร้างโครงสร้างที่สมบูรณ์จากคลาสและอ็อบเจกต์ สะพานทำสิ่งนี้โดยการแบ่งคลาสอย่างน้อยหนึ่งคลาสออกเป็นลำดับชั้นแยกกัน: นามธรรมและการใช้งาน การเปลี่ยนแปลงการทำงานในลำดับชั้นหนึ่งไม่ได้ทำให้เกิดการเปลี่ยนแปลงในลำดับชั้นอื่น ทั้งหมดนี้ใช้ได้และดี แต่คำจำกัดความนี้กว้างมากและไม่ได้ตอบคำถามที่สำคัญที่สุด: "รูปแบบสะพานคืออะไร" ฉันคิดว่าคุณจะเข้าใจการใช้งานจริงได้ง่ายขึ้น เอาล่ะ เรามาสร้างสถานการณ์จำลองแบบคลาสสิกสำหรับรูปแบบสะพานกัน เรามีShapeคลาสนามธรรมซึ่งแสดงถึงรูปทรงเรขาคณิตทั่วไป:
  • 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, RectangleGreenและ RectangleRedหกชั้นเรียนไม่ใช่ปัญหาใหญ่ แต่! หากเราต้องการเพิ่มรูปร่างหรือสีใหม่ จำนวนคลาสจะเพิ่มขึ้นแบบทวีคูณ จะออกจากสถานการณ์นี้ได้อย่างไร? การจัดเก็บสีในฟิลด์และระบุตัวเลือกทั้งหมดโดยใช้คำสั่งแบบมีเงื่อนไขไม่ใช่ทางออกที่ดีที่สุด วิธีแก้ไขที่ดีคือย้ายสีไปยังอินเทอร์เฟซแยกต่างหาก. ไม่พูดเร็วกว่าทำ: มาสร้างColorอินเทอร์เฟซที่มีการใช้งานสามแบบ: BlackColor, GreenColorและRedColor:
  • 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ชั้นเรียน เราจะได้ค่าของมันในตัวสร้าง

  • 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ที่นี่ คุณจะเห็นโครงสร้างอิสระ 2 โครงสร้างที่สามารถแก้ไขได้โดยไม่กระทบต่อฟังก์ชันการทำงานของกันและกัน ในกรณีของเรา:
  • สิ่งที่เป็นนามธรรมคือShapeคลาส
  • RefinedAbstract คือTriangleและRectangleคลาส
  • Implementor คือColorอินเทอร์เฟซ
  • ConcreteImplementor คือBlackColor, GreenColorและRedColorคลาส
คลาสShapeคือสิ่งที่เป็นนามธรรม — กลไกสำหรับจัดการการเติมรูปร่างด้วยสีต่างๆ ซึ่งมอบหมายให้กับColorอินเทอร์เฟซ (Implementor) คลาสTriangleand Rectangleเป็นคลาสคอนกรีตที่ใช้กลไกที่Shapeคลาส มีให้ BlackColorและGreenColorเป็นRedColorการนำไปใช้อย่างเป็นรูปธรรมในลำดับขั้นของการดำเนินการ

ใช้รูปแบบสะพานที่ไหน

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

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

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

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

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

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

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

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

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