«Դեկորատոր (նախագծման ձևանմուշ)»–ի խմբագրումների տարբերություն

Content deleted Content added
Տող 45.
 
[[Component Object Model|COM (Component Object Model)]] ճարտարապետությունը չի սպասարկում ժառանգումը: Դրա փոխարեն այն առաջարկում է դեկորատորներ (կոնկերտ ճարտարապետության մեջ այն կոչվում է «ագրեգացիա»):
 
==Օրինակներ==
=== C++ ===
<source lang=cpp>
#include <iostream>
#include <memory>
class IComponent {
public:
virtual void operation() = 0;
virtual ~IComponent(){}
};
class Component : public IComponent {
public:
virtual void operation() {
std::cout<<"World!"<<std::endl;
}
};
class DecoratorOne : public IComponent {
std::shared_ptr<IComponent> m_component;
public:
DecoratorOne(IComponent* component): m_component(component) {}
virtual void operation() {
std::cout << ", ";
m_component->operation();
}
};
class DecoratorTwo : public IComponent {
std::shared_ptr<IComponent> m_component;
public:
DecoratorTwo(IComponent* component): m_component(component) {}
virtual void operation() {
std::cout << "Hello";
m_component->operation();
}
};
int main() {
DecoratorTwo obj(new DecoratorOne(new Component()));
obj.operation(); // prints "Hello, World!\n"
return 0;
}
</source>
 
=== C# ===
<source lang="csharp">
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();
}
}
 
/// <summary>
/// Component - компонент
/// </summary>
/// <remarks>
/// <li>
/// <lu>определяем интерфейс для объектов, на которые могут быть динамически
/// возложены дополнительные обязанности;</lu>
/// </li>
/// </remarks>
abstract class Component
{
public abstract void Operation();
}
 
/// <summary>
/// ConcreteComponent - конкретный компонент
/// </summary>
/// <remarks>
/// <li>
/// <lu>определяет объект, на который возлагается дополнительные обязанности</lu>
/// </li>
/// </remarks>
class ConcreteComponent : Component
{
public override void Operation()
{
Console.Write("Привет");
}
}
 
/// <summary>
/// Decorator - декоратор
/// </summary>
/// <remarks>
/// <li>
/// <lu>хранит ссылку на объект <see cref="Component"/> и определяет интерфейс,
/// соответствующий интерфейсу <see cref="Component"/></lu>
/// </li>
/// </remarks>
abstract class Decorator : Component
{
protected Component component;
 
public void SetComponent(Component component)
{
this.component = component;
}
 
public override void Operation()
{
if (component != null)
{
component.Operation();
}
}
}
 
/// <summary>
/// ConcreteDecoratorA - конкретный декоратор
/// </summary>
/// <remarks>
/// <li>
/// <lu>Выполняет основную задачу</lu>
/// </li>
/// </remarks>
class ConcreteDecoratorA : Decorator
{
public override void Operation()
{
base.Operation();
}
}
 
/// <summary>
/// ConcreteDecorator - конкретный декоратор
/// </summary>
/// <remarks>
/// <li>
/// <lu>Выполняет основную задачу + дополнительную</lu>
/// </li>
/// </remarks>
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
 
Console.Write(" Мир!");
}
}
}
</source>
 
=== [[Java]] ===
<source lang="java">
public interface InterfaceComponent {
void doOperation();
}
 
class MainComponent implements InterfaceComponent {
@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
}
}
</source>
 
== Ծանոթագրություններ ==