设计模式初阶——装饰者模式
一、什么是装饰者模式?
【设计模式初阶——装饰者模式】简而言之,装饰者模式是一种可以动态地、灵活地将所需要的功能加到主体上去的设计模式。
我们来考虑这样一个场景,先来设计一辆车,这辆车最初只能在地上跑,当然这也是作为车的基本需求。然而随着科技的进步和市场的要求,我们需要将它改装为能具有飞行能力的第二代车,随后我们又需要将其改装成具有在水上航行能力的第三代车。当然,我们也可以基于第一代车,给其增加在水上航行的能力,而不增加飞行的能力。怎么改装取决于需要。看到没,这样就是可以动态地、灵活地给车主体增加功能。
具体的代码示例如下:
public abstract class Vehicle {
public abstract void run();
}
public class JeepCar extends Vehicle {
@Override
public void run() {
System.out.println("can run on the ground");
}
}
如上,我们就实现了可以在陆地上跑的第一代车。现在我们需要给其加上飞行和航行的能力:
public abstract class VehicleDecorator extends Vehicle {
// 额外的其它功能
public abstract void sleep();
}
public class PlaneWrapper extends VehicleDecorator {
private Vehicle vehicle;
public PlaneWrapper(Vehicle vehicle){
this.vehicle = vehicle;
}
@Override
public void run() {
System.out.println("can fly in the air");
vehicle.run();
}
@Override
public void sleep() {
System.out.println("can sleep on the plane");
}
}
public class ShipWrapper extends VehicleDecorator {
private Vehicle vehicle;
public ShipWrapper(Vehicle vehicle){
this.vehicle = vehicle;
}
@Override
public void run() {
System.out.println("can swim in the water");
vehicle.run();
}
@Override
public void sleep() {
System.out.println("can sleep on the ship");
}
}
我们可以看到,第二代和第三代的车都不是直接继承
Vehicle
的,这是为什么呢?答案是为了方便地扩展第二代和第三代车的其它功能,这些额外的功能也许是某一代车所特有的,同时也是作为一个装饰器抽象后续所有的迭代车系列。当然,在这里,你也可以让第二代和第三代车直接继承
Vehicle
,这也是没什么问题的。最后,车终于做好了,可以开车了。
public class Test {
public static void main(String[] args) {
Vehicle jeep = new JeepCar();
System.out.println("***The first generation:***");
jeep.run();
PlaneWrapper jeep2 = new PlaneWrapper(jeep);
System.out.println("***The second generation:***");
jeep2.run();
jeep2.sleep();
ShipWrapper jeep3 = new ShipWrapper(jeep2);
System.out.println("***The third generation:***");
jeep3.run();
jeep3.sleep();
}
}
执行的结果为:
***The first generation:***
can run on the ground
***The second generation:***
can fly in the air
can run on the ground
can sleep on the plane
***The third generation:***
can swim in the water
can fly in the air
can run on the ground
can sleep on the ship
二、为什么要使用装饰者模式? 可以在不用改动原有逻辑的基础上动态、灵活地增加新的功能。
三、如何使用装饰者模式呢? 使用的要点如下:
- 需要创建一个装饰器,继承实体的最顶层抽象;
- 可以在装饰器里增加需要实现的额外的功能;
- 需要创建新的实体类,继承装饰器,实现其最顶层的逻辑,同时实现在装饰器中新增的逻辑。
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术