ลองดูตัวอย่าง: พิจารณาว่าคุณต้องการสร้างสองแอปพลิเคชัน:
- โปรแกรมแชท
- แอปพลิเคชันตัวดำเนินการรถพยาบาลฉุกเฉิน
คนกลาง
การสร้างแอปพลิเคชันแชทคุณจะต้องเลือกmediator
รูปแบบการออกแบบ
- บุคคลเหล่านี้อาจเข้าร่วมและออกจากการแชทในเวลาใดก็ได้ดังนั้นจึงไม่สมเหตุสมผลที่จะอ้างอิงโดยตรงระหว่างบุคคลสองคนที่สนทนา
- เรายังคงต้องอำนวยความสะดวกในการสื่อสารระหว่างบุคคลสองคนและอนุญาตให้มีการสนทนา
ทำไมเราถึงชอบmediator
? เพียงแค่ดูคำจำกัดความ:
ด้วยรูปแบบสื่อกลางการสื่อสารระหว่างวัตถุจะถูกห่อหุ้มไว้ภายในออบเจ็กต์คนกลาง วัตถุไม่สื่อสารโดยตรงอีกต่อไป แต่สื่อสารผ่านสื่อกลางแทน ซึ่งจะช่วยลดการอ้างอิงระหว่างวัตถุที่สื่อสารซึ่งจะช่วยลดการมีเพศสัมพันธ์
เวทมนตร์ทำงานอย่างไร? ก่อนอื่นเราจะสร้างสื่อกลางการแชทและทำให้วัตถุบุคคลลงทะเบียนกับมันดังนั้นมันจะมีการเชื่อมต่อสองทิศทางกับทุกคน (บุคคลนั้นสามารถส่งข้อความโดยใช้คนกลางการแชททำให้มันเข้าถึงได้และคนกลางการแชทจะเข้าถึง วิธีการที่ได้รับจากวัตถุบุคคลทำให้เขาสามารถเข้าถึงได้)
function Person(name) {
let self = this;
this._name = name;
this._chat = null;
this._receive(from, message) {
console.log("{0}: '{1}'".format(from.name(), message));
}
this._send(to, message) {
this._chat.message(this, to, message);
}
return {
receive: (from, message) => { self._receive(from, message) },
send: (to, message) => { self._send(to, message) },
initChat: (chat) => { this._chat = chat; },
name: () => { return this._name; }
}
}
function ChatMediator() {
let self = this;
this._persons = [];
return {
message: function (from, to, message) {
if (self._persons.indexOf(to) > -1) {
self._persons[to].receive(from, message);
}
},
register: function (person) {
person.initChat(self);
self._persons.push(person);
}
unRegister: function (person) {
person.initChat(null);
delete self._persons[person.name()];
}
}
};
//Usage:
let chat = new ChatMediator();
let colton = new Person('Colton');
let ronan = new Person('Ronan');
chat.register(colton);
chat.register(ronan);
colton.send(colton, 'Hello there, nice to meet you');
ronan.send(ronan, 'Nice to meet you to');
colton.send(colton, 'Goodbye!');
chat.unRegister(colton);
ผู้สังเกตการณ์
การสร้างแอปพลิเคชันการโทร 911 คุณจะต้องเลือกobserver
รูปแบบการออกแบบ
observer
วัตถุรถพยาบาลแต่ละชิ้นต้องการได้รับแจ้งเมื่อมีสถานการณ์ฉุกเฉินดังนั้นเขาจึงสามารถขับรถไปตามที่อยู่และให้ความช่วยเหลือได้
- เจ้าหน้าที่ปฏิบัติการฉุกเฉิน
observable
จะอ้างอิงถึงรถพยาบาลแต่ละคันobservers
และแจ้งให้พวกเขาทราบเมื่อต้องการความช่วยเหลือ (หรือเกิดเหตุการณ์)
ทำไมเราถึงชอบobserver
? เพียงแค่ดูคำจำกัดความ:
วัตถุที่เรียกว่าหัวเรื่องจะเก็บรักษารายชื่อผู้อยู่ในอุปการะเรียกว่าผู้สังเกตการณ์และแจ้งให้พวกเขาทราบโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงสถานะใด ๆ โดยปกติจะเรียกใช้วิธีใดวิธีหนึ่ง
function AmbulanceObserver(name) {
let self = this;
this._name = name;
this._send(address) {
console.log(this._name + ' has been sent to the address: ' + address);
}
return {
send: (address) => { self._send(address) },
name: () => { return this._name; }
}
}
function OperatorObservable() {
let self = this;
this._ambulances = [];
return {
send: function (ambulance, address) {
if (self._ambulances.indexOf(ambulance) > -1) {
self._ambulances[ambulance].send(address);
}
},
register: function (ambulance) {
self._ambulances.push(ambulance);
}
unRegister: function (ambulance) {
delete self._ambulances[ambulance.name()];
}
}
};
//Usage:
let operator = new OperatorObservable();
let amb111 = new AmbulanceObserver('111');
let amb112 = new AmbulanceObserver('112');
operator.register(amb111);
operator.register(amb112);
operator.send(amb111, '27010 La Sierra Lane Austin, MN 000');
operator.unRegister(amb111);
operator.send(amb112, '97011 La Sierra Lane Austin, BN 111');
operator.unRegister(amb112);
ความแตกต่าง:
- การแชท
mediator
มีการสื่อสารสองทางระหว่างวัตถุบุคคล (ส่งและรับ) ในขณะที่ผู้ปฏิบัติงานobservable
มีการสื่อสารทางเดียวเท่านั้น (มันบอกให้รถพยาบาลobserver
ขับรถและเสร็จสิ้น)
- การแชท
mediator
สามารถทำให้วัตถุของบุคคลโต้ตอบระหว่างพวกเขาได้ (แม้ว่าจะไม่ใช่การสื่อสารโดยตรงก็ตาม) รถพยาบาลobservers
จะลงทะเบียนเฉพาะobservable
เหตุการณ์ของเจ้าหน้าที่
- วัตถุแต่ละคนมีการอ้างอิงถึงการแชท
mediator
และการแชทmediator
จะอ้างอิงถึงบุคคลทุกคน Wheres รถพยาบาลobserver
ไม่ให้การอ้างอิงไปยังผู้ประกอบการobservable
เพียงผู้ประกอบการอ้างอิงเก็บทุกพยาบาลobservable
observer
Programmers.StackExchange
ถูกปฏิเสธ แต่ฉันได้โพสต์คล้ายกันที่นั่นเพราะฉันสนใจคำตอบ คุณอาจพบคำตอบที่น่าสนใจ :)