这里举一个例子来说明:

有一个女人,她要化妆,这是被装饰者,有一个行为叫化妆;

又有一个女人,她也化妆,不过她先涂粉底,再画眉毛等等一步步下去;

世界上有N多女人,化妆的方式都不一样,如果采用继承,则有N多类,而采用装饰者模式,则简单许多。

女人类

这是被装饰者

public interface Woman {
    public void makeUp();
}

装饰者

public abstract class Decorator implements Woman {
    private Woman woman;

    public Decorator(Woman w) {
        this.woman = w;
    }

    public void makeUp() {
        woman.makeUp();
    }
}

装饰方式1

public class DecoratorWoman1 extends Decorator {

    public DecoratorWoman1(Woman w) {
        super(w);
    }

    @Override
    public void makeUp() {
        super.makeUp();
        fendi();
    }

    // 自定义化妆方式
    public void fendi() {
        System.out.println("打点粉底");
    }
}

装饰方式2

public class DecoratorWoman2 extends Decorator {

    public DecoratorWoman2(Woman w) {
        super(w);
    }

    @Override
    public void makeUp() {
        super.makeUp();
        huamei();
    }

    // 自定义化妆方式
    public void huamei() {
        System.out.println("画下眉毛");
    }
}

装饰方式3

public class DecoratorWoman3 extends Decorator {

    public DecoratorWoman3(Woman w) {
        super(w);
    }

    @Override
    public void makeUp() {
        super.makeUp();
        kouhong();
    }

    // 自定义化妆方式
    public void kouhong() {
        System.out.println("涂点口红");
    }
}

来一个具体的女人

public class XiaoHong implements Woman {

    @Override
    public void makeUp() {
        System.out.println("小红化妆");
    }

}

测试

看小红化妆

public static void main(String[] args) {
        Woman w = new XiaoHong();
//        w.makeUp();
        Decorator dc = new DecoratorWoman1(new DecoratorWoman2(new DecoratorWoman3(w)));
        dc.makeUp();
}

结果:

小红化妆
涂点口红
画下眉毛
打点粉底

应用

现在觉得和什么很像呢?没错,就是IO,那嵌套让人捉摸不定:

try {
    ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream("")));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

参考文章:http://blog.csdn.net/jason0539/article/details/22713711

results matching ""

    No results matching ""