设计模式-装饰模式
装饰模式简介
定义:属于结构型模式,不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
目的:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀,在不想增加很多子类的情况下扩展类,将具体功能职责划分,同时继承装饰者模式
优点:装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
装饰器模式完全遵守开闭原则
缺点:装饰模式会增加许多子类,过度使用会增加程序得复杂性
实现
角色:抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象
具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
代码:
1 /**抽象构件**/ 2 public interface Shape { 3 public void draw(); 4 5 } 6 7 /**具体构件**/ 8 public class ShapeImpl implements Shape{ 9 10 @Override 11 public void draw() { 12 // TODO Auto-generated method stub 13 System.out.println("此时的我是齐天大圣"); 14 15 } 16 17 } 18 19 /**抽象装饰类**/ 20 public abstract class ShapeDecorator implements Shape{ 21 protected Shape shape; 22 public ShapeDecorator (Shape shape){ 23 this.shape = shape; 24 } 25 26 public void draw(){ 27 shape.draw(); 28 } 29 30 } 31 32 /**具体装饰类A**/ 33 public class DefiniteShapeDecratorA extends ShapeDecorator{ 34 35 public DefiniteShapeDecratorA(Shape shape) { 36 super(shape); 37 } 38 private void setdrawA(){ 39 System.out.println("此时的我学艺结束,去东海抢到了定海神针"); 40 } 41 @Override 42 public void draw(){ 43 setdrawA(); 44 shape.draw(); 45 } 46 47 } 48 49 /**具体装饰类B**/ 50 public class DefiniteShapeDecratorB extends ShapeDecorator{ 51 52 public DefiniteShapeDecratorB(Shape shape) { 53 super(shape); 54 // TODO Auto-generated constructor stub 55 } 56 private void setdrawB(){ 57 System.out.println("此时的我因大闹天宫被压在五指山下-_-"); 58 } 59 @Override 60 public void draw(){ 61 shape.draw(); 62 setdrawB(); 63 64 } 65 66 } 67 68 /**测试方法**/ 69 public class Test { 70 71 public static void main(String[] args) { 72 // TODO Auto-generated method stub 73 Shape shape = new ShapeImpl(); 74 75 ShapeDecorator shapeDecorator0 = new DefiniteShapeDecratorA(shape); 76 System.out.println("Test Begin============"); 77 shapeDecorator0.draw(); 78 System.out.println("Test End============"); 79 80 ShapeDecorator shapeDecorator1 = new DefiniteShapeDecratorB(shape); 81 System.out.println("Test Begin============"); 82 shapeDecorator1.draw(); 83 System.out.println("Test End============"); 84 } 85 86 } 87 88 测试结果: 89 Test Begin============ 90 此时的我学艺结束,去东海抢到了定海神针 91 此时的我是齐天大圣 92 Test End============ 93 Test Begin============ 94 此时的我是齐天大圣 95 此时的我因大闹天宫被压在五指山下-_- 96 Test End============