本文从以下几个方面阐述装饰模式:
1.解决的问题:针对某个对象,或者实现同一个接口的一组对象,如果需要同时为这些对象增加某些功能(比如很多个功能),并且这些功能可以动态的添加时。1)如果在实体类接口中添加实现这些功能的方法,那么在每个实体类中都需要实现这些方法,很明显这不是一种好的扩展方法;2)如果采用子类的方式扩展功能,一旦扩展功能很多,就会有很多子类,造成类爆炸。这时,采用装饰模式是一个不错选的择
2.优点:从1中可以看出装饰模式具有动态扩展功能的作用;
3.缺点:多层装饰会很复杂
4.装饰模式与代理模式的区别:代理模式的主要作用是,控制被代理对象(如:通过一些逻辑判断是否使用被代理对象,即所谓的拦截对被代理对象的访问),而且代理类和被代理类需要实现同一个接口;而装饰模式的主要作用是,增强实体类的功能,并不会拦截对实体类的访问,并且外界可以直接访问实体类。下图展示了装饰模式中的类关系图
5.代码示例
public interface Shape { //实体类接口
void show ();
}
public class Retange implements Shape{ //实体类Retange
public void show() {
System.out.print("This is a retange!");
}
}
public class Circle implements Shape { //实体类Circle
public void show() {
System.out.print("This is a circle!");
}
}
public class RedShapeDecorator extends ShapeDecorator { //装饰类1
public RedShapeDecorator(Shape shape) {
super(shape);
}
@Override
public void show() {
super.show();
setRed();
}
private void setRed() {
System.out.println("set shape color Red!");
}
}
public class BlueShapeDecorator extends ShapeDecorator { //装饰类2
public BlueShapeDecorator(Shape shape) {
super(shape);
}
@Override
public void show() {
super.show();
setBlue();
}
private void setBlue() {
System.out.println("set shape color Blue!");
}
}
public class TestDecorator { //测试来
public static void main(String[] args) {
Circle circle = new Circle();
RedShapeDecorator redShapeDecorator1 = new RedShapeDecorator(circle);
redShapeDecorator1.show();
RedShapeDecorator redShapeDecorator2 = new RedShapeDecorator(new Retange());
redShapeDecorator2.show();
BlueShapeDecorator blueShapeDecorator = new BlueShapeDecorator(circle);
blueShapeDecorator.show();
}
}
//测试结果如下:
This is a circle!set shape color Red!
This is a retange!set shape color Red!
This is a circle!set shape color Blue!
Process finished with exit code 0