Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы / Лабораторная_работа_по_паттернам23.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
1.18 Mб
Скачать

// Объект

{

std::shared_ptr<X> ptr2 = ptr; //теперь у объекта два //владельца, выраженных в виде ptr и ptr2

} //Ptr2 выходит из области видимости, но объект не //освобождается, потому что есть ptr, который по-прежнему //ссылается на него } //ptr выходит из области видимости, и объект уничтожается

std:: shared_ptr<X> ptr(new X()); //создание объекта с new

Чтобы правило никогда не использовать new/delete соблюдалось, была придумана функция std::make_shared (std::make_unique ), которая позволяет создавать объекты , и теперь правило никогда не использовать может быть полностью соблюдено. Также

std::make_ shared //позволяет не писать имя класса дважды при создании

//объекта:

auto ptr = std::make_ shared <X>();

*/

C#

Пример на языке c#

using System;

namespace Decorator

{

class MainApp

{

static void Main()

{

// Create ConcreteComponent and two Decorators

ConcreteComponent c = new

ConcreteComponent();

ConcreteDecoratorA dA = new

ConcreteDecoratorA();

ConcreteDecoratorB dB = new

ConcreteDecoratorB();

// Link decorators

dA.SetComponent(c);

dB.SetComponent(dA);

dA.Operation();

Console.WriteLine();

dB.Operation();

// Wait for user

Console.Read();

}

}

/// Component – компонент, абстрактный класс

abstract class Component

{

public abstract void Operation ();

}

/// ConcreteComponent - конкретный компонент

class ConcreteComponent : Component

{

public override void Operation ()

{

Console.Write("Привет");

}

}

/// Decorator – декоратор, абстрактный класс

abstract class Decorator : Component

{

protected Component component;

public void SetComponent(Component component)

{

this.component = component;

}

public override void Operation ()

{

if (component != null)

{

component.Operation();

}

}

}

/// ConcreteDecoratorA - конкретный декоратор

class ConcreteDecoratorA : Decorator

{

public override void Operation()

{

base.Operation();

}

}

/// ConcreteDecorator - конкретный декоратор

class ConcreteDecoratorB : Decorator

{

public override void Operation()

{

Console.Write(" Мир!");

}

}

}

Java

public interface InterfaceComponent {

void doOperation();

}

class MainComponent implements InterfaceComponent {

// @Override — проверяет, переопределён ли метод.

//Вызывает ошибку компиляции, если метод не

//найден в родительском классе или интерфейсе;

@Override

public void doOperation() {

System.out.print("World!");

}

}

abstract class Decorator implements InterfaceComponent {

protected InterfaceComponent component;

public Decorator (InterfaceComponent c) {

component = c;

}

@Override

public void doOperation() {

component.doOperation();

}

public void newOperation() {

System.out.println("Do Nothing");

}

}

class DecoratorSpace extends Decorator{

public DecoratorSpace(InterfaceComponent c) {

super(c);

}

@Override

public void doOperation() {

System.out.print(" ");

super.doOperation();

}

@Override

public void newOperation() {

System.out.println("New space operation");

}

}

class DecoratorComma extends Decorator {

public DecoratorComma(InterfaceComponent c) {

super(c);

}

@Override

public void doOperation() {

System.out.print(",");

super.doOperation();

}

@Override

public void newOperation() {

System.out.println("New comma operation");

}

}

class DecoratorHello extends Decorator {

public DecoratorHello(InterfaceComponent c) {

super(c);

}

@Override

public void doOperation() {

System.out.print("Hello");

super.doOperation();

}

@Override

public void newOperation() {

System.out.println("New hello operation");

}

}

class Main {

public static void main (String... s) {

Decorator c = new DecoratorHello(new

DecoratorComma(new DecoratorSpace(new

MainComponent())));

c.doOperation();

// Результат выполнения программы "Hello, World!"

c.newOperation(); // New hello operation

}

}

Еще один пример диаграммы Декоратора для реализации на Jave

// setWrapped - упоковать комплект, упоковать

public interface Component {

    public ArrayList<String> getDescription();

    public double getCost();

}

public interface ComponentDecorator extends Component {

    public void setWrapped(Component c);

}

public class Computer implements Component {

//@Override — проверяет, переопределён ли метод.

//Вызывает ошибку компиляции, если метод не

//найден в родительском классе или интерфейсе;

    @Override

    public ArrayList<String> getDescription() {

  ArrayList<String> arrayList = new ArrayList<String>();

   arrayList.add("My computer");

    return arrayList;

    }

     @Override

    public double getCost() {

        return 33000.0;

    }

}

public class Keyboard implements ComponentDecorator {

    Component wrapped;

     public Keyboard(Component c){

        setWrapped(c);

    }

    @Override

    public void setWrapped(Component c) {

        this.wrapped = c;

    }

 

    @Override

    public ArrayList<String> getDescription() {

        ArrayList<String> arrayList = wrapped.getDescription();

        arrayList.add("Logitech Keyboard K200");

        return arrayList;

    }

     @Override

    public double getCost() {

        return wrapped.getCost() + 820.;

    }

}

public class Mouse implements ComponentDecorator {

    Component wrapped;

 

    public Mouse(Component c){

        setWrapped(c);

    }

    @Override

    public void setWrapped(Component c) {

        this.wrapped = c;

    }

     @Override

    public ArrayList<String> getDescription() {

        ArrayList<String> arrayList = wrapped.getDescription();

        arrayList.add("SteelSeries Sensei MLG 62153 Black");

        return arrayList;

    }

     @Override

    public double getCost() {

        return wrapped.getCost() + 7190.;

    }

}

public class Memory implements ComponentDecorator {

    Component wrapped;

     public Memory(Component c){

        setWrapped(c);

    }

     @Override

    public void setWrapped(Component c) {

        this.wrapped = c;

    }

     @Override

    public ArrayList<String> getDescription() {

        ArrayList<String> arrayList = wrapped.getDescription();

        arrayList.add("Toshiba STOR.E 1TB");

        return arrayList;

    }

     @Override

    public double getCost() {

        return wrapped.getCost() + 4630.;

    }

}

public class Main {

    public static void main(String[] args){

        Component computer = new Computer();

        computer = new Keyboard(computer);

        computer = new Mouse(computer);

        computer = new Memory(computer);

        computer = new Memory(computer);

        System.out.println("Order for my computer");

        for (String part : computer.getDescription()){

            System.out.println("Component: "+part);

        }

        System.out.println("Total cost: "+computer.getCost());

    }

Результат:

Order for my computer

Component: My computer

Component: Logitech Keyboard K200

Component: SteelSeries Sensei MLG 62153 Black

Component: Toshiba STOR.E 1TB

Component: Toshiba STOR.E 1TB

Total cost: 50270.0

==================================================