Ճակատ (նախագծման ձևանմուշ)

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Անվան այլ կիրառումների համար տե՛ս՝ Ճակատ (այլ կիրառումներ)
Ճակատ
ՏեսակԿառուցվածքային
ՆշանակությունՄիասնական ինտերֆեյս ապահովելու համար ենթահամակարգի բոլոր նմուշների համար
Նկարագրությունը ԳօՖի
"Design Patterns" գրքում
Այո

Ճակատ (անգլ.՝ Decorator), կառուցվածքային նախագծման ձևանմուշ, որը թույլ է տալիս թաքցնել համակարգի բարդությունը բոլոր հնարավոր կանչերը տեղափոխելով մեկ օբյեկտի վրա, որն իր տակից կանչում է համակարգի համապատասխան օբյեկտին։

Ընդհանուր հասկացողություններ[խմբագրել | խմբագրել կոդը]

  • Client - հայցող
  • Instance - նմուշ
  • Implementation - իրականացում
  • Product - արգասիք

Կիրառություն[խմբագրել | խմբագրել կոդը]

Ճակատ նախագծման ձևանմուծն օգտագործվում է, որպես պարզ և հեշտ ինտերֆեյս տրամադրեն հայցողին[1]։ Բացի այդ ադապտերը կարելի է օգտագործել, երբ ծրագիրը պետք է ունենա որոշակի ինտերֆեյս և պետք է ունենա պոլիմորֆիկ վարքագիծ։ Դեկորատորը թույլ է տալիս փոփոխել ինտերֆեյսի վարքը ծրագրի իրականացման ժամանակ։

Pattern Intent
Ադապտեր Փոխակերպում է մեկ ինտերֆեյսը մեկ այլի՝ ինչ-որ ակնկալում է հայցողը
Դեկորատոր Դինամիկ կերպով պատասխանատվություն է ավելացնում ինտեֆեյսին բնօրինակ կոդի ծրարումով (անգլ.՝ wrap)
Ճակատ Տրամադրում է պարզեցված ինտերֆեյս

Ճակատ նախագծման ձևանմուշը որպես կանոն օգտագործում են, երբ

  • անհրաժեշտ է պարզ ինտերֆեյս բարդ համակարգի հետ աշխատելու համար
  • ենթահամակարգի աբստրակցիան և իրականացումը սերտորեն կապված են
  • պետք է մեկ կետ ծրագրի բոլոր մակարդակների համար
  • համակարգը չափազանց բարդ է հասկանալու համար

UML դիագրամ[խմբագրել | խմբագրել կոդը]

Օրինակներ[խմբագրել | խմբագրել կոդը]

Բերվածը աբստրակտ օրինակ է, թե ինչպես է հայցողն առնչվում է բարդ համակարգի հետ։

C#[խմբագրել | խմբագրել կոդը]

Իրականացում[խմբագրել | խմբագրել կոդը]

namespace IVSR.Designpattern.Facade
{
    class SubsystemA
    {
        public string OperationA1()
        {
            return "Subsystem A, Method A1\n";
        }
        public string OperationA2()
        {
            return "Subsystem A, Method A2\n";
        }
    }

    class SubsystemB
    {
        public string OperationB1()
        {
            return "Subsystem B, Method B1\n";
        }

        public string OperationB2()
        {
            return "Subsystem B, Method B2\n";
        }
    }

    class SubsystemC
    {
        public string OperationC1()
        {
            return "Subsystem C, Method C1\n";
        }

        public string OperationC2()
        {
            return "Subsystem C, Method C2\n";
        }
    }

    public class Facade
    {
        private SubsystemA a = new SubsystemA();
        private SubsystemB b = new SubsystemB();
        private SubsystemC c = new SubsystemC();
        public void Operation1()
        {
            Console.WriteLine("Operation 1\n" +
            a.OperationA1() +
            a.OperationA2() +
            b.OperationB1());
        }
        public void Operation2()
        {
            Console.WriteLine("Operation 2\n" +
            b.OperationB2() +
            c.OperationC1() +
            c.OperationC2());
        }
    }
}

Պարզ կոդ[խմբագրել | խմբագրել կոդը]

namespace IVSR.DesignPattern.Facade.Sample
{
    // The 'Subsystem ClassA' class
    class CarModel
    {
        public void SetModel()
        {
            Console.WriteLine(" CarModel - SetModel");
        }
    }

    /// <summary>
    /// The 'Subsystem ClassB' class
    /// </summary>
    class CarEngine
    {
        public void SetEngine()
        {
            Console.WriteLine(" CarEngine - SetEngine");
        }
    }

    // The 'Subsystem ClassC' class
    class CarBody
    {
        public void SetBody()
        {
            Console.WriteLine(" CarBody - SetBody");
        }
    }

    // The 'Subsystem ClassD' class
    class CarAccessories
    {
        public void SetAccessories()
        {
            Console.WriteLine(" CarAccessories - SetAccessories");
        }
    }

    // The 'Facade' class
    public class CarFacade
    {
        private CarModel model;
        private CarEngine engine;
        private CarBody body;
        private CarAccessories accessories;

        public CarFacade()
        {
            model = new CarModel();
            engine = new CarEngine();
            body = new CarBody();
            accessories = new CarAccessories();
        }

        public void CreateCompleteCar()
        {
            Console.WriteLine("******** Creating a Car **********\n");
            model.SetModel();
            engine.SetEngine();
            body.SetBody();
            accessories.SetAccessories();

            Console.WriteLine("\n******** Car creation is completed**********");
        }
    }

    // Facade Pattern Demo
    class Program
    {
        static void Main(string[] args)
        {
            CarFacade facade = new CarFacade();

            facade.CreateCompleteCar();

            Console.ReadKey();

        }
    }
}

Java[խմբագրել | խմբագրել կոդը]

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

Ruby[խմբագրել | խմբագրել կոդը]

# Complex Parts
class CPU
  def freeze; end
  def jump(position); end
  def execute; end
end

class Memory
  def load(position, data); end
end

class HardDrive
  def read(lba, size); end
end

# Facade
class ComputerFacade

  def initialize
    @processor = CPU.new
    @ram = Memory.new
    @hd = HardDrive.new
  end

  def start
    @processor.freeze
    @ram.load(BOOT_ADDRESS, @hd.read(BOOT_SECTOR, SECTOR_SIZE))
    @processor.jump(BOOT_ADDRESS)
    @processor.execute
  end
end

# Client
computer_facade = ComputerFacade.new
computer_facade.start

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]

  1. Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (eds.). «Head First Design Patterns» (paperback). 1. O'Reilly: 243, 252, 258, 260. ISBN 978-0-596-00712-6. Վերցված է 2012 թ․ հուլիսի 2-ին. {{cite journal}}: Cite journal requires |journal= (օգնություն)