Факэдэ (Фасад) загвар нь Програм хангамжийн инженерчлэл сэдэвт хамаарагдах зохиомжийн загвар-уудын нэг бөгөөд ихэвчлэн Объект хандалтат технологи-той цуг ашиглагддаг.

Факэдэ нь обьект бөгөөд class library шиг томоохон кодтой хэсэг рүү хандах замыг хөнгөвчилж өгдөг. Факэдэ загварыг ашигласнаар дараахи давуу талуудтай:

  • Факэдэ загварыг ихэнхи кодын ажлуудад ашиглахад тохиромжтой учраас software library-г ашиглах, ойлгох, тест хийхэд хялбар болдог;
  • library ашиглаж байгаа кодыг уншихад илүү хялбар болгоно;
  • Ихэнхи программын код факэдэ загварыг ашиглачих учраас library доторхи ажлууд ба гадаад код 2-ын хоорондын хамаарал багасна. Ингэснээр системийг илүү уян хатан хөгжүүлэх боломжтой болно.
  • муу загварчлагдсан API-нуудын цуглуулгыг зөв зохион байгуулагдсан ганц API болгоно.


Бүтэц засварлах

 

Facade (Загвар:Pron-en)
The facade class abstracts Packages 1, 2, and 3 from the rest of the application.
Clients
The objects using the Facade Pattern to access resources from the Packages.
Packages

Жишээнүүд засварлах

Java засварлах

This is an abstract example of how a client ("you") interacts with a facade (the "computer") to a complex system (internal computer parts, like CPU and HardDrive).

/* 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 Computer {
	private CPU cpu=null;
	private Memory memory=null;
	private HardDrive hardDrive=null;

	public Computer() {
		this.cpu=new CPU();
		this.memory=new Memory();
		this.hardDrive=new HardDrive();
	}

	public void startComputer() {
		cpu.freeze();
		memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
		cpu.jump(BOOT_ADDRESS);
		cpu.execute();
	}
}

/* Client */

class You {
	public static void main(String[] args) {
		Computer facade = new Computer();
		facade.startComputer();
	}
}

C# засварлах

using System;

namespace Facade
{
	public class CPU
        {
		public void Freeze() { }
		public void Jump(long addr) { }
		public void Execute() { }
	}

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

	public class HardDrive
	{
		public byte[] Read(long lba, int size) { return null; }
	}

	public class Computer
	{
		CPU _cpu = new CPU();
		Memory _memory = new Memory();
		HardDrive _hardDrive = new HardDrive();

		public void StartComputer()
		{
			_cpu.Freeze();
			_memory.Load(0x22, hardDrive.Read(0x66, 0x99));
			_cpu.Jump(0x44);
			_cpu.Execute();
		}
	}

	public class SomeClass
	{
            public static void Main(string[] args)
            {
                Computer facade = new Computer();
                facade.StartComputer();
            }
        }
}

Python засварлах

# Complex parts
class CPU:
    def freeze(self): pass
    def jump(self, position): pass
    def execute(self): pass
 
class Memory:
    def load(self, position, data): pass
 
class HardDrive:
    def read(self, lba, size): pass
 
# Facade
class Computer:
    def __init__(self):
        self.cpu = CPU()
        self.memory = Memory()
        self.hard_drive = HardDrive()
    
    def start_computer(self):
        self.cpu.freeze()
        self.memory.load(0, self.hard_drive.read(0, 1024))
        self.cpu.jump(10)
        self.cpu.execute()
 
# Client
if __name__ == '__main__':
    facade = Computer()
    facade.start_computer()

PHP засварлах

/* Complex parts */
class CPU
{
    public function freeze() { /* ... */ }
    public function jump( $position ) { /* ... */ }
    public function execute() { /* ... */ }

}

class Memory
{
    public function load( $position, $data ) { /* ... */ }
}

class HardDrive
{
    public function read( $lba, $size ) { /* ... */ }
}

/* Facade */
class Computer
{
    protected $cpu = null;
    protected $memory = null;
    protected $hardDrive = null;

    public function __construct()
    {
        $this->cpu = new CPU();
        $this->memory = new Memory();
        $this->hardDrive = new HardDrive();
    }

    public function startComputer()
    {
        $this->cpu->freeze();
        $this->memory->load( BOOT_ADDRESS, $this->hardDrive->read( BOOT_SECTOR, SECTOR_SIZE ) );
        $this->cpu->jump( BOOT_ADDRESS );
        $this->cpu->execute();
    }
}

/* Client */
$facade = new Computer();
$facade->startComputer();

Javascript засварлах

Uses Firebug.

/* Complex parts */
var CPU = function () {};
CPU.prototype = {
  freeze: function () {
    console.log('CPU: freeze');
  },
  jump: function (position) {
    console.log('CPU: jump to ' + position);
  },
  execute: function () {
    console.log('CPU: execute');
  }
};

var Memory = function () {};
Memory.prototype = {
  load: function (position, data) {
    console.log('Memory: load "' + data + '" at ' + position);
  }
};

var HardDrive = function () {};
HardDrive.prototype = {
  read: function (lba, size) {
    console.log('HardDrive: read sector ' + lba + '(' + size + ' bytes)');
    return 'hdd data';
  }
};


/* Facade */
var Computer = function () {
  var cpu, memory, hardDrive;
  
  cpu = new CPU();
  memory = new Memory();
  hardDrive = new HardDrive();

  var constant = function (name) {
    var constants = {
      BOOT_ADDRESS: 0,
      BOOT_SECTOR: 0,
      SECTOR_SIZE: 512
    };

    return constants[name];
  };

  this.startComputer = function () {
    cpu.freeze();
    memory.load(constant('BOOT_ADDRESS'), hardDrive.read(constant('BOOT_SECTOR'), constant('SECTOR_SIZE')));
    cpu.jump(constant('BOOT_ADDRESS'));
    cpu.execute();
  }

};

/* Client */
var facade = new Computer();
facade.startComputer();

Нэмэлт холбоосууд засварлах

Загвар:Design Patterns Patterns