JavaRush /Java блогу /Random-KY /Мисалдар менен жасалгалоочу дизайн үлгүсү
Sbv239
Деңгээл
Санкт-Петербург

Мисалдар менен жасалгалоочу дизайн үлгүсү

Группада жарыяланган
Декоратордун дизайн үлгүсү бир эле класстагы an objectтердин жүрүм-турумуна таасир этпестен, an objectке функцияларды динамикалык түрдө кошууга мүмкүндүк берет. Бул бир аз түшүнүксүз угулат, бирок codeду көргөндөн кийин баары түшүнүктүү болот. Функциялар - Декоратор учурдагы an objectке анын структурасын өзгөртпөстөн функционалдуулукту кошууга мүмкүндүк берет, башкача айтканда, баштапкы класс өзгөрбөйт - Декоратор дизайн үлгүсү - бул болгон класс үчүн орогучту камсыз кылган структуралык үлгү - Декоратор класстары түзүлөт оригиналдуу классты ороп, оригиналдуу класстын метод колдорун сактап, кошумча функцияларды камсыз кылыңыз - Декоратор дизайн үлгүсү көбүнчө SOLIDден бирдиктүү жоопкерчorк принцибине баш ийүү үчүн колдонулат, анткени биз баштапкы классты кошумча милдеттер менен жүктөбөйбүз, бирок аларды бөлөбүз. жасалгалоочу класстарга - Декоратор структуралык жактан дээрлик жоопкерчorк схемасына окшош (жоопкерчorктин чынжырчасы) Төмөнкү негизги жагдайларды эске алуу керек - Декоратор иштөө учурунда an objectтин жүрүм-турумун өзгөртө алуу үчүн пайдалуу. Бул codeду сактоо жана кеңейтүү оңой. - Бул үлгүнүн кемчorги бир типтеги жасалгалоочу an objectтердин көп санда колдонулушу - Декоратор үлгүсү көбүнчө Java IO класстарында колдонулат (FileReader, BufferedReader ж.б.) Биз эмне кылабыз - Интерфейс түзүңүз - Бетон түзүңүз бул интерфейстин ишке ашырылышы - Бул интерфейсти ишке ашыруу менен абстракттуу декоратор түзөлү - Абстракттуу декоратордон мураска калган конкреттүү декораторду түзөлү - Интерфейстин конкреттүү ишке ашырылышын "кооздоо" үчүн бетон декораторду колдонуңуз Ишке ашыруу : Биз Shape интерфейсин жана конкреттүү класстарды түзөбүз бул интерфейсти ишке ашыруу. Андан кийин, Shape интерфейсин ишке ашырган жана класс талаасы катары Shape an objectисине ээ болгон абстракттуу жасалгалоочу классты, ShapeDecorator түзөбүз. Мисалдар менен жасалгалоочу дизайн үлгүсү - 1 - Shape - интерфейстин аталышы - Rectangle, Triangle жана Circle класстары Shape интерфейсин ишке ашырган конкреттүү класстар болот - ShapeDecorator - ошол эле Shape интерфейсин ишке ашырган абстракттуу жасалгалоочу класс - RedShapeDecorator - ShapeDecoratorду ишке ашырган конкреттүү класс - Демо Shape an objectтерин кооздоо үчүн RedShapeDecorator колдоно турган демо класс 1-кадам : Shape интерфейсин түзүү
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. Цвет границы: красный
Мисал катары жасалгалоочу дизайн үлгүсүн карап чыгып, биз төмөнкү учурларда аны колдонуу негиздүү деген тыянак чыгарууга болот: - Биз an objectтин жүрүм-турумун же абалын кошууну, жакшыртууну же алып салууну каалаганда - Биз жөн гана функцияны өзгөрткүбүз келгенде. класстын белгилүү бир an objectисин жана калганын эч кандай өзгөрүүнү калтырбаңыз Рахмат! Долбоордук файлдар менен репозиторий geeksforgeeks.org сайтындагы макаланын негизинде Java Dev башталгыч үчүн блогум
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION