Giáo trình Kiến trúc và thiết kế phần mềm

Một Abstract Factory Pattern bao gồm các thành phần cơ bản sau:

 AbstractFactory: Khai báo dạng interface hoặc abstract class chứa các phương thức để

tạo ra các đối tượng abstract.

 ConcreteFactory: Xây dựng, cài đặt các phương thức tạo các đối tượng cụ thể.

 AbstractProduct: Khai báo dạng interface hoặc abstract class để định nghĩa đối tượng

abstract.

 Product: Cài đặt của các đối tượng cụ thể, cài đặt các phương thức được quy định tại

AbstractProduct.

 Client: là đối tượng sử dụng AbstractFactory và các AbstractProduct.

Giáo trình Kiến trúc và thiết kế phần mềm trang 1

Trang 1

Giáo trình Kiến trúc và thiết kế phần mềm trang 2

Trang 2

Giáo trình Kiến trúc và thiết kế phần mềm trang 3

Trang 3

Giáo trình Kiến trúc và thiết kế phần mềm trang 4

Trang 4

Giáo trình Kiến trúc và thiết kế phần mềm trang 5

Trang 5

Giáo trình Kiến trúc và thiết kế phần mềm trang 6

Trang 6

Giáo trình Kiến trúc và thiết kế phần mềm trang 7

Trang 7

Giáo trình Kiến trúc và thiết kế phần mềm trang 8

Trang 8

Giáo trình Kiến trúc và thiết kế phần mềm trang 9

Trang 9

Giáo trình Kiến trúc và thiết kế phần mềm trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 55 trang xuanhieu 13960
Bạn đang xem 10 trang mẫu của tài liệu "Giáo trình Kiến trúc và thiết kế phần mềm", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Kiến trúc và thiết kế phần mềm

Giáo trình Kiến trúc và thiết kế phần mềm
kết quả đầu ra.
Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]
10. Decorator Pattern
Use case:
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Code:
Bước 1
Tạo giao diện.
Shape.java
public interface Shape {
void draw();
}
Bước 2
Tạo các lớp cụ thể triển khai cùng một giao diện.
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
Bước 3
Tạo lớp trang trí trừu tượng triển khai giao diện Shape .
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
Bước 4
Tạo lớp trang trí bê tông mở rộng lớp ShapeDecorator .
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
}
Bước 5
Sử dụng RedShapeDecorator để trang trí các đối tượng Shape .
DecoratorPatternDemo.java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
Bước 6
Xác minh kết quả đầu ra.
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red
11. Facade Pattern:
UML:
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Các thành phần cơ bản của một Facade Pattern:
 Facade: biết rõ lớp của hệ thống con nào đảm nhận việc đáp ứng yêu cầu của client, sẽ
chuyển yêu cầu của client đến các đối tượng của hệ thống con tương ứng.
 Subsystems: cài đặt các chức năng của hệ thống con, xử lý công việc được gọi bởi Facade.
Các lớp này không cần biết Facade và không tham chiếu đến nó.
 Client: đối tượng sử dụng Facade để tương tác với các subsystem.
Code:
Bước 1
Tạo giao diện.
Shape.java
public interface Shape {
void draw();
}
Bước 2
Tạo các lớp cụ thể triển khai cùng một giao diện.
Rectangle.java
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle::draw()");
}
}
Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square::draw()");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
Bước 3
Tạo lớp mặt tiền.
ShapeMaker.java
public class ShapeMaker {
private Shape circle;
private Shape rectangle;
private Shape square;
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
public void drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
}
public void drawSquare(){
square.draw();
}
}
Bước 4
Sử dụng mặt tiền để vẽ các loại hình dạng khác nhau.
FacadePatternDemo.java
public class FacadePatternDemo {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
Bước 5
Xác minh kết quả đầu ra.
Circle::draw()
Rectangle::draw()
Square::draw()
12. Chain of Responsibility Pattern:
UML:
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Code:
Bước 1
Tạo một lớp trình ghi tóm tắt.
AbstractLogger.java
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
//next element in chain or responsibility
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger){
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message){
if(this.level <= level){
write(message);
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
}
if(nextLogger !=null){
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
Bước 2
Tạo các lớp cụ thể mở rộng bộ ghi nhật ký.
ConsoleLogger.java
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Standard Console::Logger: " + message);
}
}
ErrorLogger.java
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
}
FileLogger.java
public class FileLogger extends AbstractLogger {
public FileLogger(int level){
this.level = level;
}
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
}
Bước 3
Tạo các loại trình ghi nhật ký khác nhau. Gán chúng mức độ lỗi và đặt trình ghi tiếp
theo trong mỗi trình ghi. Trình ghi tiếp theo trong mỗi trình ghi đại diện cho một phần
của chuỗi.
ChainPatternDemo.java
public class ChainPatternDemo {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger errorLogger = new
ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new
FileLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new
ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO,
"This is an information.");
loggerChain.logMessage(AbstractLogger.DEBUG,
"This is an debug level information.");
loggerChain.logMessage(AbstractLogger.ERROR,
"This is an error information.");
}
}
Bước 4
Xác minh kết quả đầu ra.
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Standard Console::Logger: This is an information.
File::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.
13. Command Pattern:
UML:
Code:
 Account : là một request class.
 Command : là một interface của Command Pattern, cung cấp phương thức execute().
 OpenAccount, CloseAccount : là các ConcreteCommand, cài đặt các phương thức của
Command, sẽ thực hiện các xử lý thực tế.
 BankApp : là một class, hoạt động
như Invoker, gọi execute() của ConcreteCommand để thực thi request.
 Client : tiếp nhận request từ phía người dùng, đóng gói request thành ConcreteCommand
thích hợp và gọi thực thi các Command.
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Bước 1
Tạo giao diện lệnh.
Order.java
public interface Order {
void execute();
}
Bước 2
Tạo một lớp yêu cầu.
Stock.java
public class Stock {
private String name = "ABC";
private int quantity = 10;
public void buy(){
System.out.println("Stock [ Name: "+name+",
Quantity: " + quantity +" ] bought");
}
public void sell(){
System.out.println("Stock [ Name: "+name+",
Quantity: " + quantity +" ] sold");
}
}
Bước 3
Tạo các lớp cụ thể thực hiện giao diện Order .
BuyStock.java
public class BuyStock implements Order {
private Stock abcStock;
public BuyStock(Stock abcStock){
this.abcStock = abcStock;
}
public void execute() {
abcStock.buy();
}
}
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
SellStock.java
public class SellStock implements Order {
private Stock abcStock;
public SellStock(Stock abcStock){
this.abcStock = abcStock;
}
public void execute() {
abcStock.sell();
}
}
Bước 4
Tạo lớp invoker lệnh.
Broker.java
import java.util.ArrayList;
import java.util.List;
public class Broker {
private List orderList = new ArrayList();
public void takeOrder(Order order){
orderList.add(order);
}
public void placeOrders(){
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
Bước 5
Sử dụng lớp Broker để nhận và thực hiện các lệnh.
CommandPatternDemo.java
public class CommandPatternDemo {
public static void main(String[] args) {
Stock abcStock = new Stock();
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
BuyStock buyStockOrder = new BuyStock(abcStock);
SellStock sellStockOrder = new SellStock(abcStock);
Broker broker = new Broker();
broker.takeOrder(buyStockOrder);
broker.takeOrder(sellStockOrder);
broker.placeOrders();
}
}
Bước 6
Xác minh kết quả đầu ra.
Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold
14. Iterator Pattern
 Aggregate : là một interface định nghĩa định nghĩa các phương thức để tạo Iterator object.
 ConcreteAggregate : cài đặt các phương thức của Aggregate, nó cài đặt interface tạo
Iterator để trả về một thể hiện của ConcreteIterator thích hợp.
 Iterator : là một interface hay abstract class, định nghĩa các phương thức để truy cập và
duyệt qua các phần tử.
 ConcreteIterator : cài đặt các phương thức của Iterator, giữ index khi duyệt qua các phần
tử.
 Client : đối tượng sử dụng Iterator Pattern, nó yêu cầu một iterator từ một đối tượng
collection để duyệt qua các phần tử mà nó giữ. Các phương thức của iterator được sử dụng
để truy xuất các phần tử từ collection theo một trình tự thích hợp.
Use case:
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Code:
Bước 1
Tạo giao diện.
Iterator.java
public interface Iterator {
public boolean hasNext();
public Object next();
}
Container.java
public interface Container {
public Iterator getIterator();
}
Bước 2
Tạo lớp cụ thể thực hiện giao diện Container . Lớp này có NameIterator lớp bên
trong thực hiện giao diện Iterator .
NameRepository.java
public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
Bước 3
Sử dụng NameRepository để lấy tên trình lặp và in.
IteratorPatternDemo.java
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator();
iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
Bước 4
Xác minh kết quả đầu ra.
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
Name : Robert
Name : John
Name : Julie
Name : Lora
15. Observer Pattern
UML:
Chương trình của chúng ta như sau:
 Subject : cung cấp các phương thức để thêm, loại bỏ, thông báo observer.
 AccountService : đóng vai trò là ConcreteSubject, sẽ thông báo tới tất cả các observers
bất cứ khi nào có thao tác của người dùng liên quan đến đăng nhập, tài khoản hết hạn.
 Observer : định nghĩa một phương thức update() cho các đối tượng sẽ được subject thông
báo đến khi có sự thay đổi trạng thái. Phương thức này chấp nhận đối số
là SubjectState, cho phép các ConcreteObserver sử dụng dữ liệu của nó.
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
 Logger,Mailer và Protector là các ConcreteObserver. Sau khi nhận được thông báo rằng
có thao tác với user và gọi tới phương thức update(), các ConcreteObserver sẽ sử dụng dữ
liệu SubjectState để xử lý.
Code:
Bước 1
Tạo lớp Chủ đề.
Subject.java
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List observers = new ArrayList();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
Bước 2
Tạo lớp Observer.
Observer.java
public abstract class Observer {
protected Subject subject;
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
public abstract void update();
}
Bước 3
Tạo các lớp quan sát cụ thể
BinaryObserver.java
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: " +
Integer.toBinaryString( subject.getState() ) );
}
}
OctalObserver.java
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: " +
Integer.toOctalString( subject.getState() ) );
}
}
HexaObserver.java
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
Youtube.com/PoppinKhiem - Sân chơi giới trẻ PTIT
System.out.println( "Hex String: " +
Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
Bước 4
Sử dụng Chủ thể và các đối tượng quan sát cụ thể.
ObserverPatternDemo.java
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
Bước 5
Xác minh kết quả đầu ra.
First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010

File đính kèm:

  • pdfgiao_trinh_kien_truc_va_thiet_ke_phan_mem.pdf