markdown:
**Tìm hiểu về Strategy pattern.**
*Bài viết được tham khảo từ cuốn Design pattern for dummies*
**1. Giới thiệu về design pattern**
Design Pattern là một kỹ thuật trong lập trình hướng đối tượng, nó khá quan trọng và mọi lập trình viên muốn giỏi đều phải biết. Được sử dụng thường xuyên trong các ngôn ngữ OOP. Nó sẽ cung cấp cho bạn các "mẫu thiết kế", giải pháp để giải quyết các vấn đề chung, thường gặp trong lập trình. Các vấn đề mà bạn gặp phải có thể bạn sẽ tự nghĩ ra cách giải quyết nhưng có thể nó chưa phải là tối ưu. Design Pattern giúp bạn giải quyết vấn đề một cách tối ưu nhất, cung cấp cho bạn các giải pháp trong lập trình OOP.
Trong Design Pattern có 3 nhóm bao gồm:
Creational Pattern (nhóm khởi tạo) gồm: Abstract Factory, Factory Method, Singleton, Builder, Prototype. Nó sẽ giúp bạn trong việt khởi tạo đối tượng, như bạn biết để khởi tạo bạn phải sử dụng từ khóa new, nhóm Creational Pattern sẽ sử dụng một số thủ thuật để khởi tạo đối tượng mà bạn sẽ không nhìn thấy từ khóa này.
Structural Pattern (nhóm cấu trúc) gồm: Adapter, Bridge, Composite, Decorator, Facade, Proxy và Flyweight.. Nó dùng để thiết lập, định nghĩa quan hệ giữa các đối tượng.
Behavioral Pattern gồm: Interpreter, Template Method, Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy và Visitor. Nhóm này dùng trong thực hiện các hành vi của đối tượng.
**2. Tìm hiểu strategy pattern**
Strategy pattern là gì?
Strategy pattern (mẫu chiến lược): hiểu một cách đơn giản thì đây là mẫu thiết kế giúp bạn trừu tượng hóa những hành vi (behavior, method, function) của một đối tượng bằng cách đưa ra những cài đặt vào những lớp khác nhau.
Bài toán thực tế.
Bạn nhận được một hợp đồng thiết kế ô tô. Có rất nhiều mẫu ô tô để bạn có thể làm. Bạn nghĩ ngay đến việc sử dụng OOP vào trong thiết kế ô tô của mình. Đầu tiên, bạn tạo ra 1 lớp cơ sở có tên là Vehicle với một phương thức có tên là go, phương thức này xuất hiện lên dòng chữ
Now I’m driving.
abstract class Vehicle { public function go() { echo "Now I'm driving"; } }
Sau đó, bạn tạo tiếp 1 lớp mới là lớp StreetRacer thừa kế từ lớp Vehicle như sau:
public class StreetRacer extends Vehicle { }
Tới đây, chương trình của bạn vẫn hoàn toàn tốt đẹp. Bạn có thể khai báo 1 đối tượng StreetRacer và gọi tới hàm go:
Và kết quả trả về là:
Now I’m driving. Kết quả hoàn toàn chính xác.
Nhưng sau đó, bạn nhận thêm 1 hợp đồng sản xuất máy bay trực thăng Helicopter. Bạn nhận thấy máy bay trực thăng thì cũng là 1 phương tiện vận chuyển. Vì vậy bạn quyết định tạo ra 1 lớp Helicopter thừa kế từ lớp Vehicle:
public class Helicopter extends Vehicle { }
Nhưng bạn chợt nhận ra vấn đề là khi sử dụng hàm go cho Helicopter, thì kết quả trả về có vẻ không chính xác.
Now I’m driving? Tại sao máy bay lại là
driving? Máy bay thì phải bay chứ nhỉ? Nhưng nó không phải là vấn đề lớn. Bạn quyết định sẽ override hàm go cho lớp Helicopter như sau:
public class StreetRacer extends Vehicle { public function go() { echo "Now I'm flying"; } }
Có vẻ vấn đề đã được giải quyết. Giờ thì máy bay đã là
flying rồi. Nhưng vài tuần sau, khách hàng yêu cầu phải chuyển từ
Now, I’m flying sang
Now, I’m flying 200mph và nhiều sự thay đổi kế tiếp.
Có một vấn đề nảy sinh ở đây. Đó chưa phải là một vấn đề lớn, nhưng nếu bạn phải xử lý các công việc này một cách khá thường xuyên, thì việc cứ phải chỉnh sửa các lớp con như thế này trờ thành 1 vấn đề bảo trì khá nghiêm trọng.
Bạn bắt đầu suy nghĩ. Có lẽ sự thừa kế không phải là cách giải quyết tốt cho tình huống này. Nơi mà bạn cần phải thay đổi các chức năng thường xuyên ở các lớp con. Và khi có càng nhiều lớp kế thừa liên quan, chúng cũng cần được bảo trì khi có sự thay đổi và khi đó, bạn sẽ phải cập nhất phương thức go nhiều lần.
Vấn đề bạn cần phải giải quyết ở đây là làm sao để tránh được việc thay đổi ở các lớp con, nếu không, bạn sẽ phải thay đổi code ở rất nhiều file để cập nhật được yêu cầu của khách hàng.
Có lẽ là bạn cần một cách khác tốt hơn để xử lý vấn đề này thay vì sử dụng thừa kế. :)
**Nắm vững sự thay đổi từ “is-a” sang “has-a”**
Với sự kế thừa, lớp cơ sở và các lớp con có một mối quan hệ “is-a”. Ví dụ , lớp Helicopter có quan hệ “is-a” với lớp Vehicle, điều này có nghĩa Helicopter thừa kế mọi thứ từ Vehicle, và nếu bạn phải chỉnh sửa các phương thức này, bạn sẽ gặp phải vấn đề bảo trì nó trong tương lai. Lớp cơ sở xử lý phương thức theo một cách, và lớp kế thừa lại thay đổi nó, và lớp kế tiếp lại thay đổi nó thêm một lần nữa. Và cuối cùng bạn có một lô một lốc các biến thể của cùng 1 phương thức qua các lớp con.
Mặc khác, nếu bạn có thể trích những đoạn code dễ thay đổi và đóng gói chúng vào đối tượng, bạn có thể sử dụng các đối tượng này khi cần. Nhiệm vụ mới là xử lý trên các đối tượng này. Bạn đã không để việc xử lý lây lan qua các lớp con. Làm như vậy sẽ cho phép bạn chỉnh sửa code của bạn bằng việc tạo ra “sự kết hợp” composites các đối tượng. Với composites “kết hợp” này, bạn có thể dễ dàng chọn ra và sử dụng đối tượng cần thiết. Một quan hệ “has-a” mới được tạo ra. Một đối tượng StreetRacer sẽ có một “has-a” cách để di chuyển (go), đã được đóng gói vào đối tượng. Một Helicopter sẽ có một cách riêng để di chuyển (go), và cũng được đóng gói vào đối tượng. Từng đối tượng sẽ thực hiện hành động của riêng nó. Một đối tượng, một nhiệm vụ thường là có ý nghĩa hơn là việc kế thừa các lớp, và tạo ra hàng tá các lớp con. Nói cách khác, chúng ta sắp xếp lại dựa trên nhiệm vụ của lớp, chứ không phải trên sự kế thừa.
**Cách tạo thuật toán:**
Đầu tiên, bạn tạo 1 giao diện interface cho phương thức go như sau:
public interface goAlgorithm { public function go(); }
Trong giao diện goAlgorithm chỉ có duy nhất 1 phương thức là go. Sau đó bạn sẽ tạo các lớp cụ thể cho từng thuật toán. Đầu tiên là lớp GoByDrivingAlgorithm, thực hiện như sau:
class GoByDrivingAlgorithm implements goAlgorithm { public function go() { echo "Now I'm driving"; } }
Ngoài ra, lớp GoByFlyingAlgorithm sẽ định nghĩa cho các phương tiện có thể bay.
class GoByFlyingAlgorithm implements goAlgorithm { public function go() { echo "Now I'm flying"; } }
Và thậm chí bạn còn có thể định nghĩa phương thức go cho cả máy bay phản lực:
class GoByFlyingFastAlgorithm implements goAlgorithm { public function go() { echo "Now I'm flying very fast"; } }
Vậy là bạn đã tách được các phương thức xử lý ra khỏi các lớp cụ thể như StreetRacer hay Helicopter rồi đấy. Bây giờ bạn đã có thể đưa các thuật toán này vào sử dụng được rồi đấy.
**Sử dụng thuật toán**
Sau khi bạn tạo một đối tượng từ một thuật toán, bạn cần phải lưu trữ đối tượng ở đâu đó. Vì vậy hãy thêm vào lớp cơ sở Vehicle, một phương thức mới SetGoAlgorithm. Phương thức này sẽ quyết định thuật toán mà bạn muốn sử dụng.
abstract class Vehicle { private $goAlgorithm public function setGoAlgorithm(GoAlgorithm $__goAlgorithm ) { $goAlgorithm = $__goAlgorithm; } }
Bây giờ khi bạn muốn sử dụng một thuật toán cụ thể nào đó ở lớp kế thừa, tất cả việc cần làm là gọi phương thức setGoAlgorithm với một đối tượng thuật toán đúng.
Phương thức go trong lớp Vehicle có chút thay đổi.
public function go() { $goAlgorithm->go(); }
Bây giờ thì tất cả những gì bạn cần làm là chọn đúng thuật toán cho phương tiện. Ví dụ như StreetRacer thì sẽ là GoByDrivingAlgorithm, cho Helicopter thì sẽ là GoByFlyingAlgorithm,...
**3. Tổng kết**
Vậy là chúng ta vừa tìm hiểu về Strategy pattern (mẫu chiến lược).Ý nghĩa thực sự của mẫu chiến lược là bạn tách rời phần xử lý một chức năng cụ thể ra khỏi đối tượng của bạn. Sau đó tạo ra một tập hợp các thuật toán để xử lý chức năng đó và lựa chọn thuật toán nào mà bạn thấy đúng đắn nhất khi thực thi chương trình. Mẫu thiết kế này thường được sử dụng để thay thế cho sự kế thừa, khi bạn muốn chấm dứt việc theo dõi và chỉnh sửa một chức năng qua nhiều lớp con.
Strategy pattern cho thấy đôi khi nó sẽ được áp dụng tốt cho mục đích hướng chức năng. Và nó đặc biệt quan trọng khi bạn muốn thực hiện công việc nâng cấp, bảo trì cho các đoạn mã dễ thay đổi của bạn một cách riêng biệt với toàn bộ mã của chương trình, hoặc khi bạn muốn thay đổi thuật toán sử dụng khi chương trình được thực thi.
**Bạn nên sử dụng strategy pattern cho những trường hợp sau:**
- Bạn có một đoạn code dễ thay đổi, và bạn tách chúng ra khỏi chương trình chính để dễ dàng bảo trì
- Bạn muốn tránh sự rắc rối, khi phải hiện thực một chức năng nào đó qua quá nhiều lớp con.
- Bạn muốn thay đổi thuật toán sử dụng khi chạy chương trình
Comments
No comments yet.

X-Powered-By: Express

set-cookie: connect.sid=s%3AxKa_RQ6DZo9Oc6XjeLyooqj8YoMHUY0l.KDhfbpvdPUVi1rXRryVUkapRw82WcmhTbzJxLGI4xRE; Path=/; Expires=Tue, 12 Dec 2017 07:35:57 GMT; HttpOnly

Link: </_nuxt/manifest.c860542bd04f4dc7e481.js>; rel=preload; as=script,</_nuxt/common.44e5101435317d4cbbaf.js>; rel=preload; as=script,</_nuxt/app.f3422337b2d903c26aa3.js>; rel=preload; as=script,</_nuxt/common.d4af6514f2d62a600a6c77b3b50cfea4.css>; rel=preload; as=style,</_nuxt/pages/p/_post.65093bd977a23cff51c1.js>; rel=preload; as=script

X-Proxy-Cache: MISS


markdown:
**(VTC News) - Thế giới vừa đón chào em bé đầu tiên được sinh ra từ kỹ thuật kết hợp DNA từ một bố và hai mẹ.**
Theo đó, cậu bé Abrahim Hassan mang trong mình 3 mẫu DNA từ bố mẹ của cậu là Jordan Ibtisam Shaban và Mahmoud Hassan cùng một đoạn mã gen từ một người khác.
Thực tế, Abrahim đã chào đời từ tháng 4 nhưng phải mãi cho đến gần đây tờ
*New Scientist* mới chính thức thông báo thông tin được coi là một cách mạng cho y khoa thế giới này. ![ Em be dau tien do 3 nguoi sinh ra tren the gioi hinh anh 1](https://image.vtcns.com/files/dieuhoa/2016/09/28/57eaa227c46188653a8b468d-1542.jpg)
## Em bé đầu tiên chào đời từ 1 cha 2 mẹ
Theo
*RT*, mẹ của cậu bé mắc hội chứng Shaban, một hội chứng rối loạn có thể truyền từ mẹ sang con, khiến đứa trẻ có thể tử vong vài tháng hoặc vài năm sau khi chào đời. Đó là một phần lý do trước Abrahim, bố mẹ của cậu đã mất đi hai người con do chứng bệnh di truyền này.
Tuy nhiên, họ vẫn không chịu khuất phục trước số phận và quyết định tìm đến John Zhang, một bác sĩ làm việc tại Trung tâm sinh sản New Hope ở New York với hi vọng có thể thay thế đoạn gen bị ảnh hưởng bởi một đoạn mã DNA “sạch” từ một người thứ ba.
**Video: Em bé giật thon thít vì tiếng ngáy của bố**
Phương pháp này được gọi là chuyển nhân non. Theo đó, trứng của người mẹ sẽ được loại bỏ nhân và thay thế bằng nhân của người hiến tặng trước khi được mang đi thu tinh với tinh trùng của người bố.
Có 5 trứng thử nghiệm nhờ kỹ thuật này và chỉ một trong số đó đã sống sót và phát triển thành cậu bé Abrahim với 0,1 % DNA từ người hiến tặng.
Thực tế phương pháp này chưa được chấp nhận tại Mỹ, vì vậy cặp vợ chồng phải lặn lội sang tận Mexico, nơi không có quy định về vấn đề này để thử nghiệm phương pháp này.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

WARC-Identified-Payload-Type: text/html

Server: nginx

Content-Type: text/html; charset=utf-8

Connection: close

Vary: Accept-Encoding

Pragma: no-cache

Cache-Control: public

X-Fastcgi-Cache: MISS


markdown:
![ Yến Nhi vốn là gương mặt quen thuộc với khán giả từ khi còn là thành viên của nhóm Mây Trắng. Những năm 2000, nữ ca sĩ gắn bó với hình ảnh cô nàng nhí nhảnh cùng phong cách làm đẹp xì tin. Tóc tém cá tính hay tóc tỉa ngang vai là những style yêu thích của Yến Nhi vào thời điểm bấy giờ.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-0.jpg)
## Yến Nhi vốn là gương mặt quen thuộc với khán giả từ khi còn là thành viên của nhóm Mây Trắng. Những năm 2000, nữ ca sĩ gắn bó với hình ảnh cô nàng nhí nhảnh cùng phong cách làm đẹp xì tin. Tóc tém cá tính hay tóc tỉa ngang vai là những style yêu thích của Yến Nhi vào thời điểm bấy giờ.
![ Sau khi tách khỏi Mây Trắng và thành lập nhóm Song Yến cùng chị gái Yến Trang vào năm 2007, giọng ca 'Muộn màng' tiếp tục theo đuổi phong cách thời trang và làm đẹp khá đáng yêu. Khuôn mặt người đẹp lúc đó vẫn hơi to và thô (phải).](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-1.jpg)
## Sau khi tách khỏi Mây Trắng và thành lập nhóm Song Yến cùng chị gái Yến Trang vào năm 2007, giọng ca 'Muộn màng' tiếp tục theo đuổi phong cách thời trang và làm đẹp khá đáng yêu. Khuôn mặt người đẹp lúc đó vẫn hơi to và thô (phải).
![ Năm 2009, Yến Nhi khiến công chúng bất ngờ khi đánh dấu việc quay trở lại Vbiz bằng hình ảnh nữ tính, dịu dàng với những kiểu tóc xoăn bồng bềnh và trang điểm mắt sắc sảo. Gu thời trang sành điệu, đẳng cấp hơn cũng giúp ngôi sao được đánh giá cao về diện mạo.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-2.jpg)
## Năm 2009, Yến Nhi khiến công chúng bất ngờ khi đánh dấu việc quay trở lại Vbiz bằng hình ảnh nữ tính, dịu dàng với những kiểu tóc xoăn bồng bềnh và trang điểm mắt sắc sảo. Gu thời trang sành điệu, đẳng cấp hơn cũng giúp ngôi sao được đánh giá cao về diện mạo.
![ Tuy nhiên, theo thời gian, khuôn mặt cô dần có những biểu hiện cứng đờ, khó biểu cảm.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-3.jpg)
## Tuy nhiên, theo thời gian, khuôn mặt cô dần có những biểu hiện cứng đờ, khó biểu cảm.
![ Cô khiến báo giới giật mình khi góp mặt trong một sự kiện với nước da căng lạ thường cùng phương pháp make-up 'dọa ma' (phải).](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-4.jpg)
## Cô khiến báo giới giật mình khi góp mặt trong một sự kiện với nước da căng lạ thường cùng phương pháp make-up 'dọa ma' (phải).
![ Không những thế, chiếc cằm của Yến Nhi cũng bất ngờ trở nên thon gọn.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-5.jpg)
## Không những thế, chiếc cằm của Yến Nhi cũng bất ngờ trở nên thon gọn.
![ Những thay đổi này đã khiến dư luận đặt nghi vấn cô đã dùng botox hoặc chất làm đầy để da căng mọng hơn. Tuy vậy, nữ ca sĩ luôn phủ nhận việc mình đã nhờ tới công nghệ thẩm mỹ.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-6.jpg)
## Những thay đổi này đã khiến dư luận đặt nghi vấn cô đã dùng botox hoặc chất làm đầy để da căng mọng hơn. Tuy vậy, nữ ca sĩ luôn phủ nhận việc mình đã nhờ tới công nghệ thẩm mỹ.
![ Khán giả dường như không thể nhận ra Yến Nhi với chiếc cằm nhọn, sống mũi cao khác lạ cộng thêm da mặt bóng.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-7.jpg)
## Khán giả dường như không thể nhận ra Yến Nhi với chiếc cằm nhọn, sống mũi cao khác lạ cộng thêm da mặt bóng.
![ Cô liên tục xuất hiện với gương mặt cứng đờ như tượng, chính vì vậy, ít khi công chúng bắt gặp khoảnh khắc ngôi sao cười tươi rạng rỡ như trước đây.](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-8.jpg)
## Cô liên tục xuất hiện với gương mặt cứng đờ như tượng, chính vì vậy, ít khi công chúng bắt gặp khoảnh khắc ngôi sao cười tươi rạng rỡ như trước đây.
![ Tuy có sự đột phá về phong cách thời trang nhưng gương mặt méo mó lại khiến Yến Nhi trở nên kém sắc hơn hẳn. (Nguồn: Ngôi sao)](https://image.vtcns.com/files/f2/2015/04/10/khuon-mat-cung-do-trong-hanh-trinh-lot-xac-that-bai-cua-yen-nhi-9.jpg)


markdown:
##
[
Ontario mở lại hai bệnh viện Toronto đã đóng cửa để giải quyết nạn quá tải ](https://www.thoimoi.com/doi-song/suc-khoe/ontario-mo-lai-hai-benh-vien-toronto-da-dong-cua-de-giai-quyet-nan-qua-tai/)
Ontario đang thiếu nghiêm trọng giường cho những bệnh nhân cần chữa trị. Tình trạng này sẽ có thể trầm trọng hơn khi mùa cúm bắt đầu.

Server: Apache

Connection: Upgrade, close

Vary: Accept-Encoding,Cookie,User-Agent

Content-Type: text/html; charset=UTF-8


markdown:
SỚM NHẤT CÓ THỂ
SỚM NHẤT CÓ THỂ
Đặt trước đơn hàng
tới
Arigatou Japanese Food To-Go
$ • Sushi • Japanese
Opens on Monday
Sushi Rolls
Arigatou's Sushi Combination
Boxes
Side Orders
Sushi Rolls
California
Crab, avocado
$4.35
Avocado
$4.75
Avocado and Edemame
Soybean.
$4.95
Kappa
Cucumber.
$3.99
Ultra-Man
Grilled eel, avocado.
$5.95
Cherry Blossom
Smoked salmon, cream cheese.
$6.49
Sold out
Green Caterpillar
Spicy grilled salmon, avocado.
$5.95
Sold out
Shrimp Dream
Spicy shrimp, avocado.
$6.99
Spicy Steak
Grilled beef with sweet spicy sauce, avocado.
$6.99
Miracle Mile
Spicy salmon & shrimp.
$6.99
Sold out
Inari
Sweet fried bean curd stuffed with sushi rice.
$4.75
Sold out
Spam
Grilled spam.
$4.50
Arigatou's Sushi Combination
Assorted Pieces of California, Spicy Salmon, Unagi, and Inari
14 Pieces
$14.25
Boxes
Yakisoba with Rice
Stir fried noodle with chicken/vegetable over rice.
$11.99
Chicken Egg-don
Chicken/egg cooked stew over rice.
$11.99
Katsu-don
Katsu/egg cooked stew over rice.
$12.99
Sukiyaki-don
Beef/egg stew cooked over rice.
$13.99
Unagi-don
Grilled unagi over rice.
$14.99
Bento Box
All Bento Boxes come with rice, salad & two pieces of pot stickers.
$9.24
Side Orders
Udon Noodle Soup
Gentle & tasty noodle soup with chicken & vegetable.
$6.49
Spring Rolls (2 pcs.)
$5.49
Yakitori
Skewered Chicken - 3 Sticks
$5.49
Gyoza
5 pieces.
$4.99
Edamame
Boiled soy bean.
$5.00
Rice
$3.00
Miso
$2.75
Green Tea Ice Cream
$4.00
Tiếng Việt
Azərbaycan
Bahasa Indonesia
Bahasa Melayu
Dansk
Deutsch
Deutsch (Austria)
Eesti Keel
English
English (British)
Español
Español (España)
Français
Hrvatski
Italiano
Lietuvių
Magyar
Nederlands
Norsk Bokmål
Polski
Português (Brasil)
Português (Portugal)
Pусский
Română
Slovenčina
Suomi
Svenska
Tagalog
Tiếng Việt
Türkçe
Čeština
ελληνικά
български език
українська мова
עברית
العربية
हिन्दी
ภาษาไทย
日本語
简体中文
繁體中文
香港中文版
한국어
Giới thiệu Uber Eats
Trở thành đối tác giao hàng
Trở thành Đối tác nhà hàng
Xem tất cả các thành phố
Biểu giá
Trợ giúp
CHTG
© 2017 Uber Technologies Inc.
Bảo mật
Điều khoản

X-Frame-Options: SAMEORIGIN

X-XSS-Protection: 1; mode=block

Content-Security-Policy: block-all-mixed-content; child-src 'self' *.fls.doubleclick.net bid.g.doubleclick.net pixel.mathtag.com https://c.paypal.com bs.serving-sys.com click.appcast.io analytics.recruitics.com ci.iasds01.com cdn.krxd.net www.facebook.com *.doubleclick.net *.tealiumiq.com *.demdex.net; connect-src 'self' 'self' https://events.uber.com https://staging.cdn-net.com https://www.cdn-net.com https://siteintercept.qualtrics.com events.uber.com api.mixpanel.com d1a3f4spazzrp4.cloudfront.net *.optimizely.com www.google-analytics.com *.tealiumiq.com *.demdex.net; font-src 'self' data: fonts.gstatic.com https://d3i4yxtzktqr9n.cloudfront.net https://d1a3f4spazzrp4.cloudfront.net; form-action 'self' 'self' https://staging.cdn-net.com https://www.cdn-net.com; frame-ancestors 'self'; frame-src 'self' *.fls.doubleclick.net bid.g.doubleclick.net pixel.mathtag.com staging.cdn-net.com https://c.paypal.com https://www.cdn-net.com bs.serving-sys.com click.appcast.io analytics.recruitics.com ci.iasds01.com cdn.krxd.net www.facebook.com *.doubleclick.net *.tealiumiq.com *.demdex.net; img-src 'self' data: https: https://c.paypal.com https://phx.stats.paypal.com https://b.stats.paypal.com https://slc.stats.paypal.com * * https://d3i4yxtzktqr9n.cloudfront.net https://d1a3f4spazzrp4.cloudfront.net; media-src 'self' https://d3i4yxtzktqr9n.cloudfront.net https://d1a3f4spazzrp4.cloudfront.net; object-src https://www.cdn-net.com; script-src 'self' 'unsafe-inline' 'nonce-9eddaf9b-1073-40e3-9090-28d98402d1aa' analytics.twitter.com bat.bing.com https://*.cdn-net.com https://*.siteintercept.qualtrics.com https://c.paypal.com https://staging.cdn-net.com https://www.google.ae https://www.google.at https://www.google.be https://www.google.ca https://www.google.cl https://www.google.co.ao https://www.google.co.in https://www.google.co.jp https://www.google.co.nz https://www.google.co.th https://www.google.co.uk https://www.google.co.za https://www.google.com https://www.google.com.au https://www.google.com.br https://www.google.com.co https://www.google.com.hk https://www.google.com.mx https://www.google.com.my https://www.google.com.ph https://www.google.com.sg https://www.google.com.tw https://www.google.de https://www.google.dk https://www.google.es https://www.google.fr https://www.google.ie https://www.google.it https://www.google.nl https://www.google.pl https://www.google.pt https://www.google.ru https://www.google.se https://www.paypalobjects.com maps.googleapis.com mathid.mathtag.com pixel.mathtag.com platform.twitter.com static.ads-twitter.com 'unsafe-eval' script.crazyegg.com www.google-analytics.com maps.googleapis.com maps.google.com tags.tiqcdn.com beacon.krxd.net cdn.krxd.net cdn.mxpnl.com www.googleadservices.com www.ziprecruiter.com analytics.recruitics.com edge.quantserve.com secure.quantserve.com connect.facebook.net cdn.nanigans.com api.nanigans.com *.adroll.com s.yimg.com sp.analytics.yahoo.com click.app-cast.com i.l.inmobicdn.net *.optimizely.com *.tealiumiq.com *.doubleclick.net static.ads-twitter.com https://www.google-analytics.com https://ssl.google-analytics.com https://d3i4yxtzktqr9n.cloudfront.net https://d1a3f4spazzrp4.cloudfront.net; style-src 'self' 'unsafe-inline' fonts.googleapis.com https://pullo.uberinternal.com https://d3i4yxtzktqr9n.cloudfront.net https://d1a3f4spazzrp4.cloudfront.net; report-uri https://csp.uber.com/csp?a=web-eats&ro=false&v=1

Link: <https://www.ubereats.com/ar-SA/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ar-SA", <https://www.ubereats.com/az-AZ/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="az-AZ", <https://www.ubereats.com/be-BY/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="be-BY", <https://www.ubereats.com/cs-CZ/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="cs-CZ", <https://www.ubereats.com/da-DK/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="da-DK", <https://www.ubereats.com/bg-BG/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="bg-BG", <https://www.ubereats.com/de-DE/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="de-DE", <https://www.ubereats.com/en-CA/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="en-CA", <https://www.ubereats.com/el-GR/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="el-GR", <https://www.ubereats.com/en-GB/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="en-GB", <https://www.ubereats.com/en-US/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="en-US", <https://www.ubereats.com/es-ES/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="es-ES", <https://www.ubereats.com/es/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="es", <https://www.ubereats.com/et-EE/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="et-EE", <https://www.ubereats.com/fi-FI/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="fi-FI", <https://www.ubereats.com/fr-CA/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="fr-CA", <https://www.ubereats.com/fr-FR/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="fr-FR", <https://www.ubereats.com/he-IL/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="he-IL", <https://www.ubereats.com/hi-IN/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="hi-IN", <https://www.ubereats.com/hr-HR/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="hr-HR", <https://www.ubereats.com/hu-HU/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="hu-HU", <https://www.ubereats.com/id-ID/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="id-ID", <https://www.ubereats.com/it-IT/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="it-IT", <https://www.ubereats.com/ja-JP/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ja-JP", <https://www.ubereats.com/ka-GE/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ka-GE", <https://www.ubereats.com/km-KH/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="km-KH", <https://www.ubereats.com/ko-KR/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ko-KR", <https://www.ubereats.com/kk-KZ/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="kk-KZ", <https://www.ubereats.com/lt-LT/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="lt-LT", <https://www.ubereats.com/lv-LV/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="lv-LV", <https://www.ubereats.com/ms-MY/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ms-MY", <https://www.ubereats.com/nb-NO/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="nb-NO", <https://www.ubereats.com/nl-NL/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="nl-NL", <https://www.ubereats.com/pl-PL/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="pl-PL", <https://www.ubereats.com/pt-BR/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="pt-BR", <https://www.ubereats.com/pt-PT/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="pt-PT", <https://www.ubereats.com/ro-RO/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ro-RO", <https://www.ubereats.com/sk-SK/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="sk-SK", <https://www.ubereats.com/ru-RU/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ru-RU", <https://www.ubereats.com/sl-SI/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="sl-SI", <https://www.ubereats.com/sr-RS/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="sr-RS", <https://www.ubereats.com/sv-SE/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="sv-SE", <https://www.ubereats.com/sw/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="sw", <https://www.ubereats.com/tl-PH/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="tl-PH", <https://www.ubereats.com/th-TH/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="th-TH", <https://www.ubereats.com/tr-TR/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="tr-TR", <https://www.ubereats.com/uk-UA/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="uk-UA", <https://www.ubereats.com/ur/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="ur", <https://www.ubereats.com/zh-CN/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="zh-CN", <https://www.ubereats.com/zh-HK/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="zh-HK", <https://www.ubereats.com/zh-TW/stores/54fa6a93-44c5-4bb7-ad02-e18725ba58a4/>; rel="alternate"; hreflang="zh-TW"

X-Uber-App: web-eats

X-Content-Type-Options: nosniff


markdown:
Công ty Cổ phần Vật Giá Việt Nam. Số GCNDT: 0102015284, cấp ngày 21/06/2012, nơi cấp: Sở kế hoạch và đầu tư thành phố Hà Nội
Trụ sở chính: 102 Thái Thịnh Phường Trung Liệt, Quận Đống Đa, Hà Nội - Chi nhánh Đà Nẵng: Số 31 Trần Phú, Hải Châu 1, Hải Châu, Đà Nẵng - Chi nhánh Hồ Chí Minh: Đường Lữ Gia, Phường 15, Quận 11, Hồ Chí Minh
Trụ sở chính: 102 Thái Thịnh Phường Trung Liệt, Quận Đống Đa, Hà Nội - Chi nhánh Đà Nẵng: Số 31 Trần Phú, Hải Châu 1, Hải Châu, Đà Nẵng - Chi nhánh Hồ Chí Minh: Đường Lữ Gia, Phường 15, Quận 11, Hồ Chí Minh
Dương Anh Quân 29/11/2008 - 20:15


markdown:
Công ty Cổ phần Vật Giá Việt Nam. Số GCNDT: 0102015284, cấp ngày 21/06/2012, nơi cấp: Sở kế hoạch và đầu tư thành phố Hà Nội
Trụ sở chính: 102 Thái Thịnh Phường Trung Liệt, Quận Đống Đa, Hà Nội - Chi nhánh Đà Nẵng: Số 31 Trần Phú, Hải Châu 1, Hải Châu, Đà Nẵng - Chi nhánh Hồ Chí Minh: Đường Lữ Gia, Phường 15, Quận 11, Hồ Chí Minh
Trụ sở chính: 102 Thái Thịnh Phường Trung Liệt, Quận Đống Đa, Hà Nội - Chi nhánh Đà Nẵng: Số 31 Trần Phú, Hải Châu 1, Hải Châu, Đà Nẵng - Chi nhánh Hồ Chí Minh: Đường Lữ Gia, Phường 15, Quận 11, Hồ Chí Minh
Tran Van Trung 11/01/2010 - 19:13