รูปแบบการออกแบบมัณฑนากรช่วยให้เราสามารถเพิ่มฟังก์ชันการทำงานให้กับวัตถุได้แบบไดนามิก โดยไม่ส่งผลกระทบต่อพฤติกรรมของวัตถุในคลาสเดียวกัน อาจฟังดูสับสนเล็กน้อย แต่เมื่อคุณเห็นโค้ดแล้ว ทุกอย่างจะชัดเจนขึ้น คุณสมบัติ - มัณฑนากรช่วยให้คุณสามารถเพิ่มฟังก์ชันการทำงานให้กับวัตถุที่มีอยู่โดยไม่ต้องเปลี่ยนโครงสร้างนั่นคือคลาสดั้งเดิมไม่เปลี่ยนแปลง - รูปแบบการออกแบบมัณฑนากรเป็นรูปแบบโครงสร้างที่ให้ wrapper สำหรับคลาสที่มีอยู่ - คลาสมัณฑนากรถูกสร้างขึ้นที่ ห่อคลาสดั้งเดิมและให้ฟังก์ชันเพิ่มเติมในขณะที่ยังคงรักษาลายเซ็นวิธีการของคลาสดั้งเดิมไว้ครบถ้วน - รูปแบบการออกแบบมัณฑนากรมักใช้เพื่อปฏิบัติตามหลักการความรับผิดชอบเดียวจาก SOLID เนื่องจากเราไม่ได้โหลดคลาสดั้งเดิมที่มีความรับผิดชอบเพิ่มเติม แต่แบ่งพวกมัน ในคลาสมัณฑนากร - มัณฑนากรมีโครงสร้างเกือบจะคล้ายกับห่วงโซ่ของรูปแบบความรับผิดชอบ (สายโซ่ความรับผิดชอบ) ต้องคำนึงถึงประเด็นสำคัญต่อไปนี้ - มัณฑนากรมีประโยชน์สำหรับความสามารถในการปรับเปลี่ยนพฤติกรรมของวัตถุในระหว่างรันไทม์ รหัสนี้ง่ายต่อการบำรุงรักษาและขยาย - ข้อเสียของรูปแบบนี้คือมีการใช้วัตถุมัณฑนากรประเภทเดียวกันจำนวนมาก - รูปแบบมัณฑนากรมักใช้ในคลาส Java IO (FileReader, BufferedReader ฯลฯ ) สิ่งที่เราจะทำ - สร้างอินเทอร์เฟซ - สร้างคอนกรีต การใช้งานอินเทอร์เฟซนี้ - สร้างมัณฑนากรนามธรรมโดยใช้อินเทอร์เฟซนี้ - มาสร้างมัณฑนากรคอนกรีตที่สืบทอดมาจากมัณฑนากรนามธรรม - ใช้มัณฑนากรคอนกรีตเพื่อ "ตกแต่ง" การใช้งานที่เป็นรูปธรรมของอินเทอร์เฟซ การใช้งาน : เราจะสร้างอินเทอร์เฟซ Shape และคลาสที่เป็นรูปธรรม ที่ใช้อินเทอร์เฟซนี้ ต่อไป เราจะสร้างคลาสมัณฑนากรเชิงนามธรรม ShapeDecorator ที่ใช้อินเทอร์เฟซ Shape และมีวัตถุ Shape เป็นฟิลด์คลาส
- Shape คือชื่อของอินเทอร์เฟซ - คลาสสี่เหลี่ยมผืนผ้า สามเหลี่ยม และวงกลมจะเป็นคลาสที่เป็นรูปธรรมที่ใช้อินเทอร์เฟซ Shape - ShapeDecorator เป็นคลาสมัณฑนากรแบบนามธรรมที่ใช้อินเทอร์เฟซ Shape เดียวกัน - RedShapeDecorator เป็นคลาสคอนกรีตที่ใช้ ShapeDecorator - Demo คือ คลาสสาธิตที่เราจะใช้ RedShapeDecorator เพื่อตกแต่งวัตถุรูปร่าง ขั้นตอนที่ 1 : สร้างอินเทอร์เฟซรูปร่าง

public interface Shape {
void draw();
}
ขั้นตอนที่ 2 : มาสร้างการใช้งานอินเทอร์เฟซนี้หลายอย่างกัน ในตัวอย่างด้านล่างจะมีเพียงวงกลม แต่อันที่จริงเราจะสร้างเพิ่มอีกสองสามอัน: สี่เหลี่ยมผืนผ้าและสามเหลี่ยม
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Я круг!");
}
}
ขั้นตอนที่ 3 : สร้างมัณฑนากรแบบนามธรรมที่ใช้อินเทอร์เฟซ Shape
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
//Конструктор, принимающий an object Shape
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
ขั้นตอนที่ 4 : สร้างคลาสมัณฑนากรคอนกรีตที่สืบทอดมาจากคลาสนามธรรม
public class RedShapeDecorator extends ShapeDecorator{
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape) {
System.out.println("Сообщение от RedShapeDecorator. Цвет границы: красный");
}
}
ขั้นตอนที่ 5 : ใช้ RedShapeDecorator เพื่อระบายสีวัตถุของเรา
public class Demo {
public static void main(String[] args)
{
Shape circle = new Circle();
Shape redCircle= new RedShapeDecorator(new Circle());
Shape redRectangle= new RedShapeDecorator(new Rectangle());
Shape redTriangle = new RedShapeDecorator(new Triangle());
System.out.println("\nОбычный круг:");
circle.draw();
System.out.println("\nКруг с красной границей:");
redCircle.draw();
System.out.println("\nПрямоугольник с красной границей:");
redRectangle.draw();
System.out.println("\nТреугольник с красной границей:");
redTriangle.draw();
}
}
ขั้นตอนที่ 6 : ดูที่คอนโซลแล้วชื่นชมยินดี
Обычный круг:
Я круг!
Круг с красной границей:
Я круг!
Сообщение от RedShapeDecorator. Цвет границы: красный
Прямоугольник с красной границей:
Я прямоугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
Треугольник с красной границей:
Я треугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
จากการตรวจสอบรูปแบบการออกแบบมัณฑนากรเป็นตัวอย่าง เราสามารถสรุปได้ว่าการใช้งานนั้นสมเหตุสมผลในกรณีต่อไปนี้: - เมื่อเราต้องการเพิ่ม ปรับปรุง หรืออาจลบพฤติกรรมหรือสถานะของวัตถุ - เมื่อเราเพียงต้องการเปลี่ยนฟังก์ชันการทำงาน ของวัตถุเฉพาะของคลาสและปล่อยให้ส่วนที่เหลือไม่มีการเปลี่ยนแปลง ขอบคุณ! พื้นที่เก็บข้อมูลพร้อมไฟล์โครงการ อ้างอิงจากบทความจากเว็บไซต์ geeksforgeeks.org บล็อกของฉันสำหรับ Java Dev มือใหม่
GO TO FULL VERSION