در این قسمت تیم کدگیت را با آموزش Decorator پترن در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر میباشد:
Structural Patterns
یکی از زیر شاخههای دیزاین پترن Structural Patterns است. Structural Patterns در مورد اشیا و کلاسها و چگونگی ترکیب آنها با یکدیگر صحبت میکند. برای مشخص کردن ارتباط اشیا و کلاسها با یکدیگر، این پترن ساختار سادهای را ایجاد میکند (البته بیشتر تمرکز این پترن بر روی شی گرایی است).
Decorator پترن در جاوا
Decorator پترن به کاربر اجازه میدهد ویژگیهای جدید را به یک شی ساخته شده، اضافه کند. این پترن یکی از شاخههای Structural Pattern میباشد. در این پترن معمولا یک کلاس Decorator ساخته میشود که علاوه بر ویژگیهای یک شی خاص ویژگیهای کاربر را نیز در بر میگیرد.
کد Decorator پترن در جاوا
فرض کنید ما یک interface به نام Shape داریم و متدی به نام Draw در خود دارد. ما یک ویژگی (رنگ Border) به این Shape را به کمک Decorator پترن اضافه میکنیم. در تصویر بالا دیاگرام کلاسهای به کار گرفته شده را میبینید. کد کلاسها به صورت زیر میباشد:
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
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("Border Color: Red");
}
}
تست کد Decorator پترن در جاوا
برای تست کدهای بالا، کدmain زیر را بزنید:
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}