首页 > 代码库 > 大话设计模式_装饰模式(Java代码)

大话设计模式_装饰模式(Java代码)

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

简单描述:1一个父类A(主要给各具体装饰者可以设置待装饰对象),1个具体待装饰类(继承于父类A),1个抽象装饰者(继承父类A),多个具体装饰者(继承抽象装饰者)。装饰者持有父类A的引用,每个装饰者在调用方法时都先调用持有的引用的对应方法,另外可在方法中再添加自己的功能(貌似描述得比较复杂,其实就是一传一,每个中间者都可以添加自身的功能)

大话设计模式中的截图:

Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。

例子代码:

Component类:

1 package com.longsheng.decorator;
2 
3 public abstract class Component {
4 
5     public abstract void operation();
6     
7 }
Component

ConcreteComponent类:

 1 package com.longsheng.decorator;
 2 
 3 public class ConcreteComponent extends Component {
 4 
 5     @Override
 6     public void operation() {
 7         System.out.println("具体对象");
 8     }
 9 
10 }
ConcreteComponent

Decorator类:

 1 package com.longsheng.decorator;
 2 
 3 public abstract class Decorator extends Component {
 4 
 5     protected Component comp;
 6     
 7     @Override
 8     public void operation() {
 9         if( comp != null ) {
10             comp.operation();
11         }
12     }
13     
14     public void setComponent( Component comp ) {
15         this.comp = comp;
16     }
17 
18 }
Decorator

ConcreteDecoratorA类:

 1 package com.longsheng.decorator;
 2 
 3 public class ConcreteDecoratorA extends Decorator {
 4 
 5     private String addState;
 6     
 7     @Override
 8     public void operation() {
 9         super.operation();
10         addState = "装修对象A";
11         System.out.println(addState);
12     }
13     
14 }
ConcreteDecoratorA

ConcreteDecoratorB类:

 1 package com.longsheng.decorator;
 2 
 3 public class ConcreteDecoratorB extends Decorator {
 4 
 5     private void addedBehavior() {
 6         System.out.println("装修对象B");
 7     }
 8     
 9     @Override
10     public void operation() {
11         super.operation();
12         addedBehavior();
13     }
14     
15 }
ConcreteDecoratorB

客户端:

 1 package com.longsheng.decorator;
 2 
 3 public class Client {
 4 
 5     public static void main(String[] args) {
 6         ConcreteComponent cc = new ConcreteComponent();
 7         ConcreteDecoratorA cca = new ConcreteDecoratorA();
 8         ConcreteDecoratorB ccb = new ConcreteDecoratorB();
 9         
10         cca.setComponent(cc);
11         ccb.setComponent(cca);
12         ccb.operation();
13     }
14 
15 }
Client

每个装饰对象的实现和如果使用这个对象分离,每个装饰对象只关系自己的功能,不需要关心如何被添加到对象链中。

装饰模式的变通:如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。

当原有的类中要添加新的功能、新方法、新字段、新逻辑等,这些新加入的东西只是为了满足一些只在特定情况下才会执行的特殊行为的需要,装饰模式提供了一个非常好的解决方案。它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码可以在运行时根据需要有选择、按顺序地使用装饰功能来包装对象。

装饰模式中的顺序非常重要,注意不要弄错。