设计模式之装饰器模式

2019-03-12  本文已影响0人  GitCode8

装饰器模式允许向现有对象添加新的功能,又不改变其结果。其实子类也可以实现同样的功能,但随着功能的增多,子类非常膨胀,导致臃肿难以维护。
下面我定义一个百货店接口,和两个具体类,分别负责卖笔和纸。

public interface Store {

    void sellPaper();

    void sellPen();
}
public class PenStore implements Store {
    @Override
    public void sellPaper() {
        System.out.println("我们是笔店,不卖纸");
    }

    @Override
    public void sellPen() {
        System.out.println("我们是笔店,卖各种笔");
    }
}

public class PaperStore implements Store {
    @Override
    public void sellPaper() {
        System.out.println("我们是纸店,卖各种纸");
    }

    @Override
    public void sellPen() {
        System.out.println("我们是纸店,不卖笔");
    }
}

然后我们定义一个修饰类,继承百货店,使其修饰百货店,具有百货店的功能。

public abstract class StoreDecorator implements Store {
    public Store store;

    public StoreDecorator(Store store) {
        this.store = store;
    }


    @Override
    public void sellPaper() {
        store.sellPaper();
    }

    @Override
    public void sellPen() {
        store.sellPen();
    }
}

接着我们接着修饰类的具体子类,也就是我们要添加的功能。

public class SupermarketDecorator extends StoreDecorator {

    public SupermarketDecorator(Store store) {
        super(store);
    }


    @Override
    public void sellPaper() {
        store.sellPaper();
        sellEraser();
    }

    @Override
    public void sellPen() {
        store.sellPen();
        sellEraser();
    }

    public void sellEraser(){
        System.out.println("还卖橡皮擦");
    }
}

看看允许效果

public class Main {

    public static void main(String[] args) {

        Store store=new PenStore();

        Store market=new SupermarketDecorator(store);

        market.sellPen();


    }

}
运行结果

我们是笔店,卖各种笔
还卖橡皮擦
上一篇下一篇

猜你喜欢

热点阅读