设计模式|装饰者模式

#设计模式 [字体 ··]

结构图

image.png


代码

1package com.elltor.designpattern.decorate;
2
3public interface Component {
4    void operate();
5}
1package com.elltor.designpattern.decorate;
2
3public class ConcreteComponent implements Component {
4    @Override
5    public void operate() {
6        System.out.println("ConcreteComponent operate....(origin)");
7    }
8}
 1package com.elltor.designpattern.decorate;
 2
 3public class Decorator implements Component {
 4    protected Component component;
 5
 6    public void setComponent(Component component){
 7        this.component=component;
 8    }
 9
10
11    @Override
12    public void operate() {
13        if(this.component!=null){
14            component.operate();
15        }
16    }
17}
 1package com.elltor.designpattern.decorate;
 2
 3public class Decorator implements Component {
 4    protected Component component;
 5
 6    public void setComponent(Component component){
 7        this.component=component;
 8    }
 9
10
11    @Override
12    public void operate() {
13        if(this.component!=null){
14            component.operate();
15        }
16    }
17}
 1package com.elltor.designpattern.decorate;
 2
 3public class ConcreteDecoratorA extends Decorator {
 4    String info = "ConcreteDecoratorA";
 5
 6
 7    // 并不太好
 8    @Override
 9    public void operate() {
10        super.operate();
11        System.out.println("装饰一下..............");
12        System.out.println("info: "+info);
13    }
14}
 1package com.elltor.designpattern.decorate;
 2
 3
 4public class ConcreteDecoratorB extends Decorator {
 5    String info = "ConcreteDecoratorB";
 6
 7    @Override
 8    public void operate() {
 9        super.operate();
10        System.out.println("装饰一下..............");
11        System.out.println("info: "+info);
12    }
13}
 1package com.elltor.designpattern.decorate;
 2
 3public class Main {
 4
 5    public static void main(String[] args) {
 6        ConcreteComponent cc = new ConcreteComponent();
 7        System.out.println("未装饰前");
 8        cc.operate();
 9
10        System.out.println("\n--------------------");
11
12        System.out.println("A装饰后");
13        ConcreteDecoratorA A = new ConcreteDecoratorA();
14        A.setComponent(cc);
15        A.operate();
16
17        System.out.println("\n--------------------");
18        System.out.println("B装饰后");
19        ConcreteDecoratorA B = new ConcreteDecoratorA();
20        B.setComponent(cc);
21        B.operate();
22    }
23}
24
25//运行结果
26未装饰前
27ConcreteComponent operate....(origin)
28
29--------------------
30A装饰后
31ConcreteComponent operate....(origin)
32装饰一下..............
33info: ConcreteDecoratorA
34
35--------------------
36B装饰后
37ConcreteComponent operate....(origin)
38装饰一下..............
39info: ConcreteDecoratorA

如果一个类型的功能被代理的多了也就说明该类的需要重构了, 过多的使用装饰器会使类比较臃肿。


博客没有评论系统,可以通过 邮件 评论和交流。