- •Лабораторная работа №4 Шаблоны проектирования
- •Теоретические сведения
- •Отношения между классами. На диаграммах классов языка uml
- •Суть паттерна
- •Решение
- •Адаптер объектов
- •Адаптер классов
- •Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.
- •Фасад (Facade)
- •Концептуальный пример
- •Program.Cs:
- •Output.Txt: Результат выполнения
- •Изолирует клиентов от компонентов подсистемы Уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, упрощая работу с подсистемой.
- •Позволяет ослабить связанность между подсистемой и ее клиентами.
- •Фасад не исключает возможности приложениям напрямую обращаться к классам подсистемы, если это необходимо.
- •Заместитель (Proxy)
- •3. Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере.
- •Концептуальный пример
- •Декоратор (Decorator)
- •// Объект
- •} //Ptr2 выходит из области видимости, но объект не //освобождается, потому что есть ptr, который по-прежнему //ссылается на него } //ptr выходит из области видимости, и объект уничтожается
- •Пример на языке c#
- •Порождающие шаблоны Абстрактная фабрика (Abstract Factory)
- •1. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы.
- •3. Таким образом, еще раз - предоставляет интерфейс для создания семейств, связанных между собой, или зависимых объектов.
- •Клиент пользуется только интерфейсами, заданными в классах «Абстрактная фабрика» и «Абстрактный продукт».
- •Фабричный метод (Factory Method)
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •Одиночка (Singleton) Суть паттерна
- •If(!p_instance)
- •Поведенческие шаблоны Стратегия (Strategy)
- •Стратегии построения пути.
- •Структура
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •Output.Txt: Результат выполнения
- •Void useStrategy(void)
- •Void setStrategy(Strategy* o)
- •Int main(int /*argc*/, char* /*argv*/[])
- •Наблюдатель (Observer) Суть паттерна
- •Решение
- •Структура
- •Шаги реализации
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •// Random.Next(…) - Метод, возвращает случайное целое число //в указанном диапазоне.
- •Output.Txt: Результат выполнения
- •Использование паттерна Observer
- •Команда (Command)
- •Структура
- •Output.Txt: Результат выполнения
- •Задания для лабораторной работы
// Объект
{
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; } }
|
||||||||||||||||||
==================================================
