Mục tiêu của mẫu thiết kế Flyweight là để chia sẻ nhiều đối tượng fine-grained một cách hiệu quả Các đối tượng flyweight được chia sẻ là bất biến, chúng không thể bị

Một phần của tài liệu Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN (Trang 27)

cách hiệu quả. Các đối tượng flyweight được chia sẻ là bất biến, chúng không thể bị thay đổi vi chúng mô tả các tính chất được chia sẻ với các đối tượng khác. Một số ví dụ như các kí tự và line-style trong word processor hoặc các digit receiver trong một các ứng dụng mạng điện thoại chuyển đổi công cộng. Flyweight hiếm khi nào được sử dụng trong các ứng dụng nghiệp vụ hướng dữ liệu (data-driven business type application)

4. Chương trình minh họa Shape.java

public interface Shape { void draw();

}

Circle.java

public class Circle implements Shape { private String color;

private int x; private int y; private int radius;

public Circle(String color){ this.color = color;

}

public void setX(int x) { this.x = x;

}

this.y = y; }

public void setRadius(int radius) { this.radius = radius;

}

@Override

public void draw() {

System.out.println("Circle: Draw() [Color : " + color +", x : " + x +", y :" + y +", radius :" + radius); }

}

ShapeFactory.java

public class ShapeFactory {

private static final HashMap<String, Shape> circleMap = new HashMap(); public static Shape getCircle(String color) {

Circle circle = (Circle)circleMap.get(color); if(circle == null) {

circle = new Circle(color); circleMap.put(color, circle);

System.out.println("Creating circle of color : " + color); }

return circle; }

}

FlyWeightPattern.java

public class FlyWeightPattern { private static final String colors[] =

{ "Red", "Green", "Blue", "White", "Black" }; public static void main(String[] args) {

for(int i=0; i < 20; ++i) { Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor()); circle.setX(getRandomX()); circle.setY(getRandomY()); circle.setRadius(100); circle.draw(); }

}

private static String getRandomColor() {

return colors[(int)(Math.random()*colors.length)]; }

private static int getRandomX() { return (int)(Math.random()*100 ); }

private static int getRandomY() { return (int)(Math.random()*100); }

}

XI. Proxy Pattern

1. Sơ đồ mẫu

2. Ý nghĩa

Cho phép ta sử dụng một đối tượng proxy class để điều khiển việc truy xuất trên một đối tượng real class khác.

3. Ứng dụng

4. Chương trình minh họa Image.java

public interface Image { void display();

}

RealImage.java

public class RealImage implements Image { private String fileName;

public RealImage(String fileName){ this.fileName = fileName;

loadFromDisk(fileName); }

@Override

public void display() {

System.out.println("Displaying " + fileName); }

System.out.println("Loading " + fileName); }

}

ProxyImage.java

public class ProxyImage implements Image{ private RealImage realImage;

private String fileName;

public ProxyImage(String fileName){ this.fileName = fileName;

}

@Override

public void display() { if(realImage == null){

realImage = new RealImage(fileName); }

realImage.display(); }

}

ProxyPattern.java

public class ProxyPattern { /**

* @param args the command line arguments */

public static void main(String[] args) {

Image image = new ProxyImage("test_10mb.jpg"); //image will be loaded from disk

image.display(); System.out.println("");

//image will not be loaded from disk

image.display(); // TODO code application logic here }

}

Kêt quả :

XII. Chain of Responsibility Pattern

1. Sơ đồ mẫu

2. Ý nghĩa

Giải quyết cho việc thực hiện một chuỗi các tác vụ có trình tự mà mỗi tác vụ trong chuỗi đố được đảm nhiệm bởi một class

3. Ứng dụng

-Giúp các đối tượng khác nhau hoạt động riêng rẽ trong một chương trình -Hạn chế liên kết giữa 2 đối tượng một cách độc lập

-có nhiều đối tượng với nhiều phương thức khác nhau thích hợp với hành động mà chương trình đang yêu cầu nó sẽ chọn phương thức thích hợp nhât

4. Chương trình minh họa 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); } if(nextLogger !=null){ nextLogger.logMessage(level, message); } }

abstract protected void write(String message); }

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; }

@Override

protected void write(String message) {

System.out.println("File::Logger: " + message); }

}

ChainofresponsibiltyPattern.java

public class ChainofresponsibiltyPattern {

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.");

} }

Kêt quả :

XIII. Command Pattern

1. Sơ đồ mẫu

2. Ý nghĩa

Gói một mệnh lệnh vào trong một đối tượng mà nó có thể được lưu trữ , chuyển vào các phương thức và trả về một vài đối tượng khác

3. Ứng dụng

Một phần của tài liệu Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN (Trang 27)

Tải bản đầy đủ (DOCX)

(50 trang)
w