Design pattern trong java (Bài 8)

Design pattern trong java hay còn được gọi là mẫu kiến trúc. Design pattern trong java là
bí quyết tốt để khắc phục các vấn đề hoặc trách nhiệm rõ ràng. Đến đây,
các bạn có thể tự hỏi vấn đề rõ ràng này là gì? Https://phptravels.vn/ sẽ giải thích
thông qua một chẳng hạn.

Design pattern trong java – Chẳng hạn

Giả sử bạn mong muốn tạo một lớp & sử dụng
lớp này để tạo một đối tượng mà đối tượng này được sử dụng bởi toàn bộ
các lớp khác. Bí quyết tốt nhất trong trường hợp đó là sử dụng Singleton thiết kế pattern.

Như thế thiết kế pattern là độc lập với
ngôn từ lập trình để khắc phục các vấn đề thông dụng trong kiến trúc
hướng đối tượng. Nghĩa là một thiết kế pattern là một sáng kiến, không phải là một thiết lập rõ ràng.

Bằng cách dùng thiết kế pattern, tất cả chúng ta sẽ tạo nên những đoạn code linh động hơn, có khả năng tái sử dụng hơn & dễ bảo dưỡng cải tiến hơn.

Design pattern trong java – Các loại thiết kế pattern (Types of Design Patterns)

STTDesign pattern & Miêu tả1Creational Patterns
Nhóm này phân phối bí quyết tạo nên các đối tượng một cách linh động hơn. Nghĩa là quyết định đối tượng nào được tạo nên tuỳ thuộc vào trường hợp sử dụng khẳng định.2Structural Patterns
Nhóm này liên quan đến sự phối hợp giữa các đối tượng với nhau3Behavioral Patterns
Mẫu kiến trúc này trình bày bí quyết kiến trúc liên quan đến hành vi của các đối tượng.4J2EE Patterns
Nhóm này phân phối bí quyết kiến trúc chương trình theo mô hình nhiều tầng (multiple tier)

Design pattern trong java – Singleton pattern

Singleton thiết kế pattern là một trong
những mẫu kiến trúc dễ dàng nhất & thuộc nhóm Creational Patterns. Sau
đây là chẳng hạn thiết lập theo Singleton

Chẳng hạn sau đây được thực hiện trên nền tảng
dữ liệu EMPDB sử dụng SQL Server. Trong EMPDB có bảng ACCOUNTS. Câu lệnh
tạo bảng này như sau

CREATE TABLE ACCOUNTS (
  USERNAME VARCHAR(20) PRIMARY KEY
  ,PASS VARCHAR(20)
)

Seting (Implementation)

Bước 1: Tạo lớp Singleton (JDBCSingleton.java), cảnh báo biến đổi phần in đậm màu đỏ cho thích hợp.

package designpatterns.singleton;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCSingleton {

 private static JDBCSingleton jdbc;

 private JDBCSingleton() {
 }

 public static JDBCSingleton getInstance() {

  if (jdbc == null) {
    jdbc = new JDBCSingleton();
  }

  return jdbc;
 }

 private static Connection getConnection() throws Exception {
   return DriverManager.getConnection("jdbc:sqlserver://localhost;databaseName=EMPDB;user=sa;password=sa");
 }

 // Thêm dữ liệu vào db
 public int create(String username, String pass) throws SQLException {

   Connection ͼ = null;
   PreparedStatement ps = null;
   int cnt = 0;

   try {
    ͼ = this.getConnection();

    ps = ͼ.prepareStatement("insert into accounts(username,pass) values(?,?)");
    ps.setString(1, username);
    ps.setString(2, pass);

    cnt = ps.executeUpdate();
   } catch (Exception e) {
     System.out.print(e.toString());
   } finally {
     if (ps != null) {
       ps.close();
     }
     if (ͼ != null) {
       ͼ.close();
     }
   }
   return cnt;
 }

 //Hiển dữ liệu
 public void display(String id) throws SQLException {

   Connection con = null;
   PreparedStatement ps = null;
   ResultSet rs = null;
   int cnt = 0;

   try {
     con = this.getConnection();
     ps = con.prepareStatement("select * from accounts where username = ?");
     ps.setString(1, id);

     rs = ps.executeQuery();

     while (rs.next()) {
       System.out.println("Ten " + rs.getString("username") + " va mat khau " + rs.getString("pass"));
       cnt++;
     }

     if (cnt == 0) {
       System.out.println("Khong co tai khoan nao ton tai");
     }

   } catch (Exception e) {
     System.out.println(e);
   } finally {
     if (rs != null) {
      rs.close();
     }
     if (ps != null) {
      ps.close();
     }
     if (con != null) {
      con.close();
     }
   }
  }
}

Bước 2: Lấy đối tượng từ lớp singleton (JDBCSingletonExample.java)

package designpatterns.singleton;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCSingletonExample {

 public static void main(String[] args) throws Exception {

 //JDBCSingleton object = new JDBCSingleton();
  JDBCSingleton jdbc = JDBCSingleton.getInstance();

  Scanner s = new Scanner(System.in);
  int count = 1;
  int choice;

  do {
   System.out.println(" 1. Create account");
   System.out.println(" 2. Display account");
   System.out.println(" 3. Exit");

   System.out.print("Please enter the choice: ");
   choice = s.nextInt();

   //clear buffer
   s.nextLine();

   switch (choice) {
    case 1:
     System.out.print("Nhap ten : ");
     String username = s.nextLine();
     System.out.print("Nhap mat khau : ");
     String password = s.nextLine();

     try {
      int ι = jdbc.create(username, password);

      if (ι > 0) {
        System.out.println("Them thanh cong");
      } else {
        System.out.println("Them that bai ");
      }

     } catch (Exception e) {
       System.out.println(e);
     }
     break;
   case 2:
     System.out.print("Nhap ten : ");
     username = s.nextLine();

     try {
      jdbc.display(username);
     } catch (Exception e) {
       System.out.println(e);
     }
     break;
   }
  } while (choice != 3);
 }
}

Khi chạy chương trình trên, tất cả chúng ta sẽ thu được kết quả sau

Xem Thêm  Nối nhiều cột trong SQL Server - nối hai cột trong sql

Design pattern trong java – Adapter pattern

Adapter
Pattern hoạt động như một điểm kết nối giữa hai giao diện khác nhau (không
tương thích) & thuộc nhóm Structural Patterns. Mô hình này phối hợp khả
năng của hai giao diện độc lập.

Seting Adapter Pattern

Bước 1: Tạo interface tên MediaPlayer & AdvMediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public interface MediaPlayer {
   public void play(String audioType, String fileName);
}
/**
 *
 * @author giasutinhoc.vn
 */
public interface AdvancedMediaPlayer {
   public void playMp4(String fileName);
}

Bước 2: Tạo lớp Mp4Player thiết lập giao diện AdvMediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public class Mp4Player implements AdvancedMediaPlayer{
   @Override
   public void playMp4(String fileName) {
      System.out.println("Dang phat mp4: "+ fileName);
   }
}

Bước 3: Tạo lớp MediaAdapter thiết lập giao diện MediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public class MediaAdapter implements MediaPlayer {
   AdvancedMediaPlayer advancedMusicPlayer;
   public MediaAdapter(String audioType){
     if (audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer = new Mp4Player();
      }
   }
   @Override
   public void play(String audioType, String fileName) {
     if(audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer.playMp4(fileName);
      }
   }
}

Bước 4: Tạo lớp AudioPlayer thiết lập giao diện MediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public class AudioPlayer implements MediaPlayer {
 MediaAdapter mediaAdapter;
 @Override
 public void play(String audioType, String fileName) {
  if(audioType.equalsIgnoreCase("mp3")){
    System.out.println("Dang phat mp3: " + fileName);
  } else if(audioType.equalsIgnoreCase("mp4")){
    mediaAdapter = new MediaAdapter(audioType);
    mediaAdapter.play(audioType, fileName);
  } else{
    System.out.println("Khong hop le. " + audioType + " dinh dang khong duoc ho tro");
  }
 }
}

Bước 5: Sử dụng AudioPlayer để phát nhiều loại audio khác nhau

/**
 *
 * @author giasutinhoc.vn
 */
public class AdapterPatternExample {
   public static void main(String[] args) {
      AudioPlayer ap= new AudioPlayer();
      ap.play("mp3", "yesterday.mp3");
      ap.play("mp4", "jump.mp4");
   }
}

Khi chạy chương trình trên, tất cả chúng ta thu được kết quả sau

Dang phat mp3: yesterday.mp3 
Dang phat mp4: jump.mp4

Design pattern trong java – Chain of Responsibility Pattern

Trong Chain of Responsibility Pattern,
sender gửi một yêu cầu đến chuỗi đối tượng (chain of objects). Yêu cầu
này có thể được giải quyết bởi bất kỳ đối tượng nào trong chuỗi đối
tượng. Chain of Responsibility Pattern thuộc nhóm Behavioral Patterns.

Xem Thêm  Chuyển một tham số thông qua onClick trong React - chức năng onclick với các tham số

Seting Chain of Responsibility Pattern

Tất cả chúng ta tạo môt lớp trừu tượng
AbstractConsole có tính chất level. Sau đó, tất cả chúng ta tạo 2 loại logger
kế thừa lớp trừu tượng AbstractConsole. Mỗi khi có yêu cầu hiển thị
nhắc nhở, hệ thống sẽ dựa trên level để in nhắc nhở thích hợp (hành vi), trái lại hệ thống sẽ chuyển yêu cầu cho logger tiếp theo.

Bước 1: Tạo lớp trừu tượng AbstractConsole

/**
 *
 * @author giasutinhoc.vn
 */
public abstract class AbstractConsole {
   public static int INFO = 1;
   public static int WARNING = 2;
   protected int level;
   protected AbstractConsole nextLogger;
   public void setNextLogger(AbstractConsole nextLogger){
      this.nextLogger = nextLogger;
   }
   public void printMessage(int level, String message){
      if(this.level <= level){
         write(message);
      }
      if(nextLogger !=null){
         nextLogger.printMessage(level, message);
      }
   }
   abstract protected void write(String message);
}

Bước 2: Tạo lơp InfoLogger kế thừa lớp trừu tượng AbstractConsole

/**
 *
 * @author giasutinhoc.vn
 */
public class InfoLogger extends AbstractConsole {
   //Constructor
   public InfoLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String msg) {
      System.out.println("Info: " + mgs);
   }
}

Bước 3: Tạo lớp WarningLogger kế thừa lớp trừu tượng AbstractConsole

public class WarningLogger extends AbstractConsole {
   public WarningLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String msg) {
      System.out.println("Warning: " + msg);
   }
}

Bước 4: Tạo lớp ChainPatternExample

/**
 *
 * @author giasutinhoc.vn
 */
public class ChainPatternExample {
   private static AbstractConsole getChainOfLoggers(){
      AbstractConsole info = new InfoLogger(AbstractConsole.INFO);
      AbstractConsole warning = new WarningLogger(AbstractConsole.WARNING);      
      info.setNextLogger(warning);
      return info;
   }
   public static void main(String[] args) {
      AbstractConsole ac= getChainOfLoggers();
      ac.printMessage(AbstractConsole.INFO, "Day la info.");
      ac.printMessage(AbstractConsole.WARNING, "Day la warning.");
   }
}

Design pattern trong java – Data Access Object Pattern

Data Access Object Pattern hay DAO
Pattern được sử dụng để tách thao tác giải quyết dữ liệu tách biệt với tầng
nghiệp vụ trong khi xây dựng chương trình. DAO Pattern thuộc nhóm J2EE Patterns

Xem Thêm  Phân trang là gì? Và làm thế nào để triển khai nó trên trang web của bạn - làm thế nào để phân trang

Seting DAO Pattern trong Java

Data Access Object Interface: Khái niệm những thao tác trong hệ thống

Data Access Object Class: Seting interface & thực hiện các thao tác với dữ liệu từ CSDL, JSON/XML, …

Model Object hoặc Value Object: Đối tượng chứa các phương pháp get/set & sử dụng để đóng gói dữ liệu.

Bước 1: Tạo lớp Employee (Model Object hoặc Value Object)

/**
 *
 * @author giasutinhoc.vn
 */
public class Employee {
   private int id;
   private String name;
   Employee(int id, String name){
      this.id= id;
      this.name = name;
   }
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Bước 2: Tạo giao diện EmployeeDao (Data Access Object Interface)

/**
 *
 * @author giasutinhoc.vn
 */
import java.util.ArrayList;
public interface EmployeeDao {
   public ArrayListvàlt;Employeevàgt; getAllEmployees();
   public Employee getEmployee(int id);
   public void updateEmployee(Employee emp);
   public void deleteEmployee(Employee emp);
}

Bước 3: Tạo lớp EmployeeDaoImpl thiết lập EmployeeDao (Data Access Object Class)

import java.util.ArrayList;
/**
 *
 * @author giasutinhoc.vn
 */
public class EmployeeDaoImpl implements EmployeeDao {
   ArrayListvàlt;Employeevàgt; alEmp;
   public EmployeeDaoImpl(){
      alEmp = new ArrayListvàlt;Employeevàgt;();
      Employee e1 = new Employee(1, "Xuân");
      Employee e2 = new Employee(2, "Hạ");
      alEmp.add(e1);
      alEmp.add(e2);
   }

   @Override
   public void deleteEmployee(Employee e) {
      alEmp.remove(e.getId());
      System.out.println("Nhan vien co ID " + e.getId() + "da bi xoa");
   }

   @Override
   public ArrayListvàlt;Employeevàgt; getAllEmployees() {
      return alEmp;
   }

   @Override
   public Employee getEmployee(int id) {
      return alEmp.get(id);
   }

   @Override
   public void updateEmployee(Employee e) {
      alEmp.get(e.getId()).setName(e.getName());
      System.out.println("Nhan vien co ID " + e.getId() + " da duoc cap nhat");
   }
}

Bước 4: Tạo lớp DaoPatternExample

/**
 *
 * @author giasutinhoc.vn
 */
public class DaoPatternExample {
   public static void main(String[] args) {
      EmployeeDao empDao = new EmployeeDaoImpl();
      //Hiển thị toàn bộ
      for (Employee e : empDao.getAllEmployees()) {
         System.out.println("Nhan vien: [ID : " + e.getId() + ", Ten : " + e.getName() + "]");
      }
      //Update
      Employee e = empDao.getAllEmployees().get(0);
      e.setName("Nguyễn Văn Xuân");
      empDao.updateEmployee(e);
      //Hiển thị
      e = empDao.getEmployee(0);
      System.out.println("Nhan vien: [ID : " + e.getId() + ", Ten : " + e.getName() + "]");
   }
}

Khi chạy chương trình trên, tất cả chúng ta nhận được kết quả sau

Tham khảo thêm chỉ dẫn xây dựng mô hình mvc

Kết luận bài thiết kế pattern trong java

  • Design pattern với Creational
  • Design pattern với Structural 
  • Design pattern với Behavioral 
  • Design pattern với J2EE

Viết một bình luận