设计模式-装饰模式

装饰模式简介

定义:属于结构型模式,不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

目的:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀,在不想增加很多子类的情况下扩展类,将具体功能职责划分,同时继承装饰者模式

优点:装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用

   通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果

   装饰器模式完全遵守开闭原则

缺点:装饰模式会增加许多子类,过度使用会增加程序得复杂性

实现

角色:抽象构件(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============
原文地址:https://www.cnblogs.com/carblack/p/14132929.html