装饰器模式,顾名思义主要就是装饰的作用,在不改变原有类的基础上,添加一些装饰功能,比如有一个汽车,汽车可以跑,但是你想要一个漂亮的汽车,你可以把它装饰成你喜欢的颜色,或者你还可以改造它的外形,为了不影响原有对象的结构,我们可以定义一个装饰类,所有的装饰都通过装饰类来进行,这就是装饰器模式。
1.创建汽车接口,汽车属性是可以跑。
public interface Car {
void run();
}
2.创建一个普通汽车类,并实现汽车接口。
public class NomalCar implements Car{
@Override
public void run() {
System.out.println("车具有跑的功能");
}
}
3.创建一个用于装饰的抽象类。
public abstract class Decorator implements Car{
protected Car car;
public Decorator(Car car){
this.car = car;
}
public void run(){
car.run();
}
}
4.创建一个改变汽车外形的装饰类。
public class ShapeDecorator extends Decorator{
public ShapeDecorator(Car car) {
super(car);
}
public void run(){
car.run();
setShape(car);
}
private void setShape(Car car){
System.out.println("给车设置成流线型");
}
}
5.测试类。
public class DecoratorTest {
public static void main(String[] args){
Car nomalCar = new NomalCar();
nomalCar.run();
Car shapeCar = new ShapeDecorator(new NomalCar());
shapeCar.run();
}
}
测试结果:
车具有跑的功能
车具有跑的功能
给车设置成流线型
从结果可以看出来,我们的外型装饰类,把车成功装饰成了流线型。
6.我们再对车的颜色进行装饰。
public class ColorDecorator extends Decorator{
public ColorDecorator(Car car) {
super(car);
}
public void run(){
car.run();
setColor(car);
}
private void setColor(Car car){
System.out.println("把车设置成漂亮的红色");
}
}
测试类:
public static void main(String[] args){
Car nomalCar = new NomalCar();
nomalCar.run();
Car colorCar = new ColorDecorator(new NomalCar());
colorCar.run();
}
测试结果:
车具有跑的功能
车具有跑的功能
把车设置成漂亮的红色