Java裝飾者和代理模式是兩種常見的設計模式,在軟件開發中被廣泛應用。雖然它們有些相似之處,但實際上它們有很大的區別。下文將詳細描述這兩種模式的區別。
首先,讓我們看看Java裝飾者模式。這種模式允許您動態地將新功能添加到現有的對象中,而不用改變其結構和接口。從技術上講,裝飾者充當了包裝器,使得原始的對象保持不變,而通過添加新的功能來增強其能力。以下是一個示例代碼:
public interface Shape { void draw(); } public class Rectangle implements Shape { @Override public void draw() { System.out.println("Shape: Rectangle"); } } public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape){ this.decoratedShape = decoratedShape; } public void draw(){ decoratedShape.draw(); } } 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"); } }
現在,讓我們看看代理模式。這個模式允許您通過創建一個代理類來控制另一個類的訪問。代理和原始對象都必須實現相同的接口,以便代理能夠控制對原始對象的訪問。以下是一個示例代碼:
public interface Image { void display(); } 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); } private void loadFromDisk(String fileName){ System.out.println("Loading " + fileName); } } 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(); } }
從上面的代碼可以看出,裝飾者模式和代理模式都實現了相同的接口,但它們的目的和特點卻有很大的不同。裝飾者模式通常用于動態添加新的功能,而代理模式則用于控制對象的訪問。相比之下,裝飾者模式更注重于功能的擴展,而代理模式則更注重于控制對象的訪問。