Qua các series tự học về Design Pattern, Hôm nay cafedevn chia sẻ cho ace ví dụ và code cụ thể về cách sử dụng Mediator design pattern với ngôn ngữ lập trình Java. Nhằm giúp ace hiểu rõ cách sử Pattern này với Java một cách nhanh nhất và áp dụng nó vào thực tế.
Nội dung chính
Mô tả code
- Tạo “người trung gian” tách “người gửi” khỏi “người nhận”
- Người sản xuất chỉ được kết hợp với Người hòa giải(Mediator)
- Người tiêu dùng(Consumers) chỉ được kết hợp với Người hòa giải(Mediator)
- Người hòa giải phân xử(Mediator) việc lưu trữ và truy xuất tin nhắn
Phần code
// 1. The "intermediary"
class Mediator {
// 4. The Mediator arbitrates
private boolean slotFull = false;
private int number;
public synchronized void storeMessage(int num) {
// no room for another message
while (slotFull == true) {
try {
wait();
}
catch (InterruptedException e ) {
Thread.currentThread().interrupt();
}
}
slotFull = true;
number = num;
notifyAll();
}
public synchronized int retrieveMessage() {
// no message to retrieve
while (slotFull == false) {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
slotFull = false;
notifyAll();
return number;
}
}
class Producer implements Runnable {
// 2. Producers are coupled only to the Mediator
private Mediator med;
private int id;
private static int num = 1;
public Producer(Mediator m) {
med = m;
id = num++;
}
@Override
public void run() {
int num;
while (true) {
med.storeMessage(num = (int)(Math.random()*100));
System.out.print( "p" + id + "-" + num + " " );
}
}
}
class Consumer implements Runnable {
// 3. Consumers are coupled only to the Mediator
private Mediator med;
private int id;
private static int num = 1;
public Consumer(Mediator m) {
med = m;
id = num++;
}
@Override
public void run() {
while (true) {
System.out.print("c" + id + "-" + med.retrieveMessage() + " ");
}
}
}
public class MediatorDemo {
public static void main( String[] args ) {
List<Thread> producerList = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
System.out.println("Press ENTER for exit");
Mediator mb = new Mediator();
producerList.add(new Thread(new Producer(mb)));
producerList.add(new Thread(new Producer(mb)));
producerList.add(new Thread(new Consumer(mb)));
producerList.add(new Thread(new Consumer(mb)));
producerList.add(new Thread(new Consumer(mb)));
producerList.add(new Thread(new Consumer(mb)));
for (Thread p : producerList) {
p.start();
}
boolean stop = false;
String exit = scanner.nextLine();
while (!stop) {
if (exit.equals("")) {
stop = true;
for (Thread p : producerList) {
//noinspection deprecation
p.stop();
}
}
}
}
}
Kết quả:
p1-87 c1-87 p2-37 c3-37 p1-28 c2-28 p2-58 c1-58 p1-18 c4-18
p2-42 c3-42 p1-3 c2-3 p2-11 c3-11 p1-72 c2-72 p2-75 c3-75
p1-93 c4-93 p2-52 c1-52 p1-21 c3-21 p2-80 c4-80 p1-96 c2-96
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Tài liệu từ cafedev:
- Full series tự học Design Pattern từ cơ bản tới nâng cao tại đây nha.
- Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!