装饰模式概念
装饰者模式,也叫装饰模式,是一种设计模式,它动态地将责任附加到对象上。在装饰者模式中,我们可以通过将一个类包裹在装饰类的对象中,来扩展其功能,而不需要修改原有类的代码。这种做法符合开放封闭原则 —— 对扩展开放,对修改封闭。
装饰者模式特别适合于一项功能需要不断迭代和扩展的情况,因为你可以随时通过增加新的装饰类来增加新的功能。
装饰者作用
增强原本的类和拓展类的功能。
实现思路
装饰设计模式有3个角色:
1、共同的接口
2、原对象类(保持不变)
3、装饰类实现共同接口,实现共同接口会重写接口中的公共方法,引入原对象类进行私有化和写构造方法引入该对象 ,在重写方法中利用原有对象类对象调用自身类中的方法保持原有功能和代码不变。在此装饰类中添加新的方法去实现我们需要增强和拓展的功能。
代码实现
举一个通俗易懂的例子,我们去XXX汉堡店买汉堡。选购的汉堡是基础的,只有面包和肉饼。然后,你可以选择增加材料,比如加生菜、番茄、酸黄瓜等等。在这个例子中,基础的汉堡就像是我们的主体对象,生菜、番茄和酸黄瓜等增加的材料,就像是装饰者,用来为汉堡添加更多的风味。
在代码中,"汉堡"就像是一个接口或者是一个抽象类,并且所有的"装饰者" (生菜,番茄,酸黄瓜等)也都实现了"汉堡"这个接口。当我们创建一个新的汉堡时,我们可以选择用哪些"装饰者"去装饰它,就像我们选择加生菜、番茄或者酸黄瓜一样。
用代码来说,可能就是这样:
公共接口:
public interface Burger {
// 注意:在接口中 public abstract 可省略不写
// 制作基础汉堡
void makeBaseBurger(); // public abstract void makeBaseBurger();
}
原有对象类:
public class BaseBurger implement Burger {
private Burger burger;
public BaseBurger(Burger burger) {
this.burger = burger;
}
@Override
public void makeBaseBurger() {
System.out.println("我是基础汉堡");
}
}
装饰类:
public class BurgerDecorator implement Burger {
private Burger burger;
public burgerDecorator(Burger burger) {
this.burger = burger;
}
@Override
public void makeBaseBurger() {
burger.makeBaseBurger();
}
public void addLettuce() {
System.out.println("加生菜");
}
public void addTomato() {
System.out.println("加番茄");
}
}
我们的具体业务:
public void orderBurger() {
BurgerDecorator burger = new BurgerDecorator(new BaseBurger());
burger.makeBaseBurger(); // 基础汉堡
burger.addLettuce(); // 加生菜
burger.addTomato(); // 加番茄
}