สวัสดี! เรายังคงเข้าใจหัวข้อที่กว้างและมีประโยชน์มากอย่างต่อเนื่อง - รูปแบบการออกแบบ วันนี้เราจะมาพูดถึงบริดจ์ เช่นเดียวกับรูปแบบอื่นๆ 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
และ หกชั้นเรียนไม่ใช่เรื่องใหญ่อะไร แต่! หากเราจำเป็นต้องเพิ่มรูปร่างหรือสีใหม่ จำนวนคลาสจะเพิ่มขึ้นแบบทวีคูณ จะออกจากสถานการณ์นี้ได้อย่างไร? การจัดเก็บสีในช่องและลองใช้ตัวเลือกแบบมีเงื่อนไขไม่ใช่ทางออกที่ดีที่สุด ทางออกที่ดีคือการแสดงสีในอินเทอร์เฟซที่แยกจากกัน อย่าเพิ่งพูดแต่ทำ : มาสร้างอินเทอร์เฟซและการใช้งานสามอย่าง - และ: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
- เราจะได้รับค่าของมันในตัวสร้าง -
รูปร่าง.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
เป็นสะพานที่เชื่อมต่อระหว่างสองลำดับชั้นที่แยกจากกัน
อุปกรณ์บริดจ์: สิ่งที่เป็นนามธรรมและการนำไปปฏิบัติ
มาดูคลาสไดอะแกรมที่อธิบายรูปแบบบริดจ์กัน:
- นามธรรม - ระดับ
Shape
; - RefinedAbstraction - คลาส
Triangle
,Rectangle
; - ผู้ดำเนินการ - อินเทอร์เฟซ
Color
; - ConcreteImplementor - คลาส
BlackColor
และGreenColor
.RedColor
Shape
แสดงถึงนามธรรม - กลไกในการควบคุมสีของรูปร่างในสีที่ต่างกัน ซึ่งมอบหมายการดำเนินการให้กับอินเทอร์เฟColor
ซ คลาสTriangle
เป็นRectangle
วัตถุจริงที่ใช้กลไกที่นำเสนอโดยShape
คลาส BlackColor
และGreenColor
- RedColor
การใช้งานเฉพาะในสาขาการดำเนินงาน มักเรียกว่าแพลตฟอร์ม
รูปแบบ Bridge ใช้ที่ไหน?
ข้อได้เปรียบอย่างมากของการใช้รูปแบบนี้คือ คุณสามารถเปลี่ยนแปลงฟังก์ชันการทำงานของคลาสในสาขาหนึ่งได้โดยไม่ทำลายตรรกะของอีกสาขาหนึ่ง วิธีนี้ยังช่วยลดการเชื่อมโยงคลาสของโปรแกรมอีกด้วย เงื่อนไขหลักในการใช้รูปแบบคือ "ทำตามคำแนะนำ": อย่าติดไว้ที่ใดก็ได้! ที่จริงแล้ว เรามาดูกันว่าในกรณีใดบ้างที่คุณต้องใช้ Bridge อย่างแน่นอน:-
หากจำเป็นต้องขยายจำนวนเอนทิตีในสองทิศทาง (รูปทรงเรขาคณิต, สี)
-
หากคุณต้องการแบ่งชั้นเรียนขนาดใหญ่ที่ไม่ตรงตามหลักความรับผิดชอบเดี่ยวออกเป็นชั้นเรียนย่อยที่มีฟังก์ชันการทำงานแบบแคบ
-
หากมีความจำเป็นต้องเปลี่ยนแปลงลอจิกของการดำเนินการของเอนทิตีบางอย่างในขณะที่โปรแกรมกำลังทำงานอยู่
-
หากจำเป็น ให้ซ่อนการใช้งานจากไคลเอ็นต์คลาส (ไลบรารี)
ข้อดีและข้อเสียของรูปแบบ
เช่นเดียวกับรูปแบบอื่นๆ Bridge มีทั้งข้อดีและข้อเสีย ประโยชน์ของสะพาน:- ปรับปรุงความสามารถในการปรับขนาดโค้ด - คุณสามารถเพิ่มฟังก์ชันการทำงานโดยไม่ต้องกลัวว่าจะทำให้บางสิ่งบางอย่างเสียหายในส่วนอื่นของโปรแกรม
- ลดจำนวนคลาสย่อย - ใช้งานได้เมื่อจำเป็นต้องขยายจำนวนเอนทิตีในสองทิศทาง (เช่น จำนวนรูปร่างและจำนวนสี)
- ทำให้สามารถทำงานแยกกันใน Abstraction และ Implementation สองสาขาแยกกัน ซึ่งนักพัฒนาสองคนสามารถทำได้โดยไม่ต้องเจาะลึกรายละเอียดของโค้ดของกันและกัน
- การลดการเชื่อมต่อของคลาส - สถานที่เดียวที่มีการเชื่อมต่อสองคลาสคือบริดจ์ (ฟิลด์
Color color
)
- ขึ้นอยู่กับสถานการณ์เฉพาะและโครงสร้างของโครงการโดยรวม อาจมีผลกระทบด้านลบต่อประสิทธิภาพของโปรแกรม (ตัวอย่างเช่น หากจำเป็นต้องเตรียมใช้งานออบเจ็กต์เพิ่มเติม)
- ทำให้การอ่านโค้ดซับซ้อนขึ้นเนื่องจากจำเป็นต้องนำทางระหว่างคลาสต่างๆ
GO TO FULL VERSION