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

Վիքիպեդիայից՝ ազատ հանրագիտարանից
HS Disambig.svg Անվան այլ կիրառումների համար տես՝ Ճակատ (այլ կիրառումներ)
Ճակատ
Անգլերեն անվանում` Facade
Տեսակ` Կառուցվածքային
Նշանակություն` Միասնական ինտերֆեյս ապահովելու համար ենթահամակարգի բոլոր նմուշների համար
Կառուցվածք` UML DP Façade.png
Նկարագրությունը ԳօՖի
"Design Patterns" գրքում`
Այո

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

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

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

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

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

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

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

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

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

UML DP Façade.png

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

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

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-07-02