Professional Documents
Culture Documents
Baocao
Baocao
CÁM ƠN
Cảm ơn thầy Nguyễn Thanh Phước đã trực tiếp giảng dạy và hỗ trợ chúng tôi
Tôi xin cam đoan đây là sản phẩm đồ án của chúng tôi và được sự hướng dẫn
của TS Nguyễn Thanh Phước. Các nội dung nghiên cứu, kết quả trong đề tài này là
trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây. Những số liệu trong
các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu
thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo.
Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệu
của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.
Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm
về nội dung đồ án của mình. Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có).
TP. Hồ Chí Minh, ngày tháng năm
Tác giả
(ký tên và ghi rõ họ tên)
Tạ Trung Hiếu
Trần Văn An
iii
MỤC LỤC
PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN.........................................iii
MỤC LỤC...................................................................................................................... 1
CHƯƠNG 1 – SINGLETON PATTERN.......................................................................2
1.1 Lý do áp dụng................................................................................................2
1.2 Sơ đồ lớp.......................................................................................................2
1.3 Code áp dụng.................................................................................................2
CHƯƠNG 2 – STRATEGY PATTERN........................................................................4
2.1 Lý do áp dụng................................................................................................4
2.2 Sơ đồ lớp.......................................................................................................4
2.3 Code áp dụng.................................................................................................4
CHƯƠNG 3 – FACTORY PATTERN...........................................................................7
3.1 Lý do áp dụng................................................................................................7
3.2 Sơ đồ lớp.......................................................................................................7
3.3 Code áp dụng.................................................................................................7
CHƯƠNG 4 – ABSTRACT FACTORY PATTERN.....................................................9
4.1 Lý do áp dụng................................................................................................9
4.2 Sơ đồ lớp.......................................................................................................9
4.3 Code áp dụng.................................................................................................9
CHƯƠNG 5 – COMMAND PATTERN......................................................................12
4.1 Lý do áp dụng..............................................................................................12
4.2 Sơ đồ lớp.....................................................................................................12
4.3 Code áp dụng...............................................................................................12
TỰ ĐÁNH GIÁ............................................................................................................15
2
GIỚI THIỆU
Chương trình AH Tools là một trang web tích hợp các công cụ tiện ích cơ bản
như tính toán, vẽ hình, chuyển đổi tiền tệ, chuyển đổi thời gian giữa các khu vực,
random ngẩu nhiên... Chương trình được viết bằng ngôn ngữ Javascript và hiển thị trên
giao diện web html.
3
1.2 Sơ đồ lớp
var mySingleton = (function () {
var instance;
function init() {
let new_hours = 0;
let area = "";
return {
setInfo: function (x, y) {
new_hours = x;
area = y;
},
setUI: function () {
$("#switchTimeDisplay").html(new_hours + ":" + mins);
$("#areaDisplay").html(area);
},
};
}
return {
getInstance: function () {
if (!instance) instance = init();
return instance;
},
};
})()
// action
var inst = mySingleton.getInstance()
$("#switchBtn").click(function (e) {
let str = $("#countries").val()
let data = str.split("|")
let n = parseInt(data[0])
let area = data[1]
let new_hours
if (curent_hours + n >= 24) {
new_hours = curent_hours + n - 24
} else {
new_hours = curent_hours + n
}
inst.setInfo(new_hours, area)
5
inst.setUI()
})
2.1 Lý do áp dụng
Strategy pattern bao gồm các thuật toán (hoặc chiến lược) thay thế cho một
nhiệm vụ cụ thể. Nó cho phép một phương thức được hoán đổi trong thời gian chạy
bằng bất kỳ phương thức (chiến lược) nào khác mà khách hàng không nhận ra. Về cơ
bản, Chiến lược là một nhóm các thuật toán có thể thay thế cho nhau.
Chúng tôi áp dụng mẫu thiết kế trên cho công cụ chuyển đổi tiền tệ, cụ thể đây
là công cụ chuyển đổi tiền dựa trên tỉ giá đồng tiền giữa ba nước Việt Nam – Trung
Quốc – Mỹ.
6
2.2 Sơ đồ lớp
ChuyenDoi.prototype = {
setStrategy: function (donvi) {
this.donvi = donvi
},
calculate: function (package) {
return this.donvi.calculate(package)
7
},
}
var USDandVND = function () {
this.calculate = function (package) {
let tigia = 23081.38
if (package["from"] == "VND") {
return package["amount"] / tigia
}
return package["amount"] * tigia
}
}
var CNYandVND = function () {
this.calculate = function (package) {
let tigia = 3539.56
if (package["from"] == "VND") {
return package["amount"] / tigia
}
return package["amount"] * tigia
}
}
var USDandCNY = function () {
this.calculate = function (package) {
let tigia = 6.52
if (package["from"] == "CNY") {
return package["amount"] / tigia
}
return package["amount"] * tigia
}
}
const contains = (first, second) => {
const indexArray = first.map((el) => {
return second.indexOf(el)
})
return indexArray.indexOf(-1) === -1
}
8
$("#kqButton").click(() => {
var amount = parseFloat($("#soluong").val())
var from = $("#tu").val()
var to = $("#sang").val()
var package = {
amount: amount,
from: from,
to: to,
}
// console.log(from, to)
let chuyendoi = new ChuyenDoi()
if (contains(["VND", "USD"], [from, to]) == true) {
chuyendoi.setStrategy(new USDandVND())
} else if (contains(["CNY", "VND"], [from, to]) == true) {
chuyendoi.setStrategy(new CNYandVND())
} else if (contains(["CNY", "USD"], [from, to]) == true) {
chuyendoi.setStrategy(new USDandCNY())
} else {
return $("#kq").html("")
}
// chuyendoi.setStrategy(donvi)
return $("#kq").html(chuyendoi.calculate(package))
})
9
3.2 Sơ đồ lớp
10
function randomString() {
var length = parseInt($("#length").val());
var result = [];
var characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result.push(
characters.charAt(Math.floor(Math.random() * charactersLength))
);
}
this.str = result.join("");
}
function Factory() {
this.createRandom = function (type) {
var random;
if (type === "integer") {
random = new randomNumber();
} else if (type === "string") {
random = new randomString();
}
random.type = type;
11
random.setUI = function () {
$("#random-result").append(`<p>${this.str}</p>`);
};
return random;
};
}
var factory = new Factory();
$("#gennum-btn").click(function (e) {
var gen = factory.createRandom("integer");
gen.setUI();
});
$("#genstr-btn").click(function (e) {
var gen = factory.createRandom("string");
gen.setUI();
});
$(".clear").click(function (e) {
$("#random-result").html("");
});
12
4.2 Sơ đồ lớp
let div = `<div class="mb-3" style="border-style: solid; border-color: coral
; width:${this.kichthuoc}px; height:${this.kichthuoc}px"></div>`
$("#drawbox").prepend(div)
}
function HinhVuongFactory() {
this.create = function (kichthuoc) {
return new HinhVuong(kichthuoc)
}
}
function HinhChuNhat(dai, rong) {
this.dai = dai
this.rong = rong
14
let div = `<div class="mb-3" style="border-style: solid; border-color: coral
; width:${this.dai}px; height:${this.rong}px"></div>`
$("#drawbox").prepend(div)
}
function HinhChuNhatFactory() {
this.create = function (dai, rong) {
return new HinhChuNhat(dai, rong)
}
}
function HinhTron(bankinh) {
this.bankinh = bankinh
let duongkinh = bankinh * 2
let div = `
<div class="mb-3 rounded-circle" style="border-style: solid; border-
color: coral; width:${duongkinh}px; height:${duongkinh}px "></div>
`
$("#drawbox").prepend(div)
}
function HinhTronFactory() {
this.create = function (bankinh) {
return new HinhTron(bankinh)
}
}
// action
$("#veChuNhat").click(function (e) {
let HinhChuNhat = new HinhChuNhatFactory()
let a = $("#dai").val()
let b = $("#rong").val()
HinhChuNhat.create(a, b)
})
$("#veVuong").click(function (e) {
let HinhVuong = new HinhVuongFactory()
let x = $("#dodai").val()
HinhVuong.create(x)
})
$("#veTron").click(function (e) {
15
let HinhTron = new HinhTronFactory()
let r = $("#bankinh").val()
HinhTron.create(r)
})
$(".clear-btn").click(function (e) {
$("#drawbox").html("")
})
16
4.2 Sơ đồ lớp
return x + y
}
function sub(x, y) {
return x - y
}
function mul(x, y) {
return x * y
}
function div(x, y) {
return x / y
}
var Command = function (execute, undo, value) {
this.execute = execute
this.undo = undo
this.value = value
}
var AddCommand = function (value) {
return new Command(add, sub, value)
}
var SubCommand = function (value) {
return new Command(sub, add, value)
}
var MulCommand = function (value) {
return new Command(mul, div, value)
}
var DivCommand = function (value) {
return new Command(div, mul, value)
}
var Calculator = function () {
var current = 0
var commands = []
function action(command) {
var name = command.execute.toString().substr(9, 3)
return name.charAt(0).toUpperCase() + name.slice(1)
}
18
return {
execute: function (command) {
current = command.execute(current, command.value)
commands.push(command)
},
undo: function () {
var command = commands.pop()
current = command.undo(current, command.value)
},
getCurrentValue: function () {
return current
},
}
}
var calculator
calculator = new Calculator()
// number action
$('.number-btn').click(function () {
let n = $(this).val()
$('#screen').val($('#screen').val() + n)
})
// operation action
$('.operation-btn').click(function () {
let opera_str = $(this).val()
let screen = parseFloat($('#screen').val())
let opera
if (opera_str == '+') {
opera = new AddCommand(screen)
} else if (opera_str == '-') {
opera = new SubCommand(screen)
} else if (opera_str == '*') {
opera = new MulCommand(screen)
} else if (opera_str == '/') {
opera = new DivCommand(screen)
19
} else {
$('#screen').val(calculator.getCurrentValue())
}
calculator.execute(opera)
$('#screen').val('')
})
$('#ac').click(function () {
$('#screen').val('')
calculator = new Calculator()
})
$('#undo').click(function () {
calculator.undo()
$('#screen').val(calculator.getCurrentValue())
})
20
TỰ ĐÁNH GIÁ
Thang 1 2 3
Tự
đánh giá
Đánh
Nội dung tiêu chí
Giá
Trên ½ đến trọn
Điểm/10 0 điểm Tối đa ½ điểm
điểm
Áp dụng pattern
Singleton 1.5 điểm/pattern và tối đa 8 điểm.
Strategy Với mỗi pattern áp dụng được sẽ tính điểm trên 3 thang đo nhỏ bên dưới
Factory (một pattern có thể áp dụng nhiều lần trong project nhưng chỉ tính điểm 1
Abstract Factory lần và tối đa 1.5 điểm)
Command Pattern
Không có hoặc
Có nhưng chưa thể hiện
Lý do áp dụng: 0.3đ không hợp lý Rõ ràng, hợp lý 0.3×5
rõ
hoặc gượng ép