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.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
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
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:
- giao_trinh_kien_truc_va_thiet_ke_phan_mem.pdf