本文来讨论下java设计模式之装饰模式。

什么是装饰模式呢? 把一些附加的功能添加到主功能上。注意了,划重点,是动态的添加!随时随地可以删除,改变顺序! 就比如我做饭,核心功能就是煮了,但是在这之前,我可以淘大米,也可以不淘,之后可以不评价,也可以看到老板的青龙白虎文身而评价。这些功能都是动态的,所需要的就是在核心功能上的变动。 首先,我们定义最基本的做饭

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package top.txiner.decorator;

/**
 * @author : hundred
 * time: 18-1-15
 * website : http://txiner.top
 * 懵懂的小白
 */
public interface Cook {
    void boil();
}

我们做粥的时候,就是把煮的过程给实现了就好了,用心做好饭!(爱的味道,银鹭八宝粥!)

1
2
3
4
5
6
public class Porridge implements Cook {
    @Override
    public void boil() {
        System.out.println("boil porridge");
    }
}

做好饭了,理论上我们就可以吃了,不过别着急! 为了保证健康,我们还是做之前淘下米吧。干净卫生! 考虑到我们要动态的功能不局限在淘米过程,还有看文身的过程,所以我们直接集成Cook来淘米不合适,要不然就写死了! 所以,我们先抽象个附加功能的基类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class Decorator implements Cook {

    private Cook cook;

    public Decorator(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void boil() {
        this.cook.boil();
    }
}

要加啥功能,加上!没毛病! 淘米吧!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class Wash extends Decorator {

    public void washRice(){
        System.out.println("I have to wash rice");
    }

    public Wash(Cook cook) {
        super(cook);
    }

    @Override
    public void boil() {
        this.washRice();
        super.boil();
    }
}

这次做的确实好吃,就算老板没拿刀架我脖子上,我也要说好吃!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class Taste extends Decorator {
    public Taste(Cook cook) {
        super(cook);
    }

    public void comment(){
        System.out.println("I think the porridge is good");
    }

    @Override
    public void boil() {
        super.boil();
        this.comment();
    }
}

恩,完工! 等等,我们就是提出了这些附加功能,还没开吃呢!

1
2
3
4
5
6
7
8
9
public class Customer {

    public static void main(String[] args) {
        Cook porridge=new Porridge();
        porridge=new Wash(porridge);
        porridge=new Taste(porridge);
        porridge.boil();
    }
}

好了! 老板,刀可以拿走了嘛!

................分割.................. 装饰模式,我感觉还是一个比较灵活的模式的,但不知道为什么,总是会想到java的注解(python的装饰模式表达的时候语法就很像java的注解),以后找时间对比下,然后试一试。