装饰器模式允许向现有对象添加新的功能,又不改变其结果。其实子类也可以实现同样的功能,但随着功能的增多,子类非常膨胀,导致臃肿难以维护。
下面我定义一个百货店接口,和两个具体类,分别负责卖笔和纸。
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();
}
}
运行结果
我们是笔店,卖各种笔
还卖橡皮擦
网友评论