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