一、什么是装饰模式
装饰(Decorator)模式又叫做包装模式,是结构型模式之一。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案
二、装饰模式的特点
可以层层装饰,十分方便使用。io流使用的最多。
三、装饰模式的角色和职责
- 抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口
- 具体组件角色:为抽象组件的实现类
- 抽象装饰角色:包含一个组件的引用,并实现了与抽象组件一致的接口
- 具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰
四、装饰模式编码
1、抽象组件角色Car.java
package com.xue.decorator;
/**
* 需要装饰的接口Car
* @author xuexue
*
*/
public interface Car {
/**
* 会跑
*/
void run();
/**
* 展示功能
*/
void show();
}
2、具体组件角色RunCar.java
package com.xue.decorator;
/**
* 需要被装饰的具体实现类
* @author xuexue
*
*/
public class RunCar implements Car {
@Override
public void run() {
System.out.println("车会跑");
}
@Override
public void show() {
this.run();
}
}
3、抽象装饰角色CarDecorator.java
package com.xue.decorator;
/**
* 抽象装饰类
* @author xuexue
*
*/
public abstract class CarDecorator implements Car {
//声明一个被装饰的类
private Car car;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public CarDecorator(Car car) {
this.car = car;
}
/**
* 展示功能
*/
public abstract void show();
}
4、具体装饰角色
FlyCarDecorator.java
package com.xue.decorator;
/**
* 具体装饰类,实现了装饰抽象类
* 添加功能:车会飞
* @author xuexue
*
*/
public class FlyCarDecorator extends CarDecorator {
public FlyCarDecorator(Car car) {
super(car);
}
@Override
public void show() {
this.getCar().show();
this.fly();
}
/**
* 装饰后的类多加的功能
*/
public void fly() {
System.out.println("车会飞");
}
@Override
public void run() {
}
}
SwimCarDecorator.java
package com.xue.decorator;
/**
* 具体装饰类,实现了装饰抽象类
* 添加功能:车会游
* @author xuexue
*
*/
public class SwimCarDecorator extends CarDecorator {
public SwimCarDecorator(Car car) {
super(car);
}
@Override
public void show() {
this.getCar().show();
this.swim();
}
/**
* 装饰后的类多加的功能
*/
public void swim() {
System.out.println("车会游");
}
@Override
public void run() {
}
}
测试类Test.java
package com.xue.decorator;
public class Test {
public static void main(String[] args) {
Car runCar = new RunCar();
runCar.show();
System.out.println("-----------------------原始车只会跑");
CarDecorator flyCar = new FlyCarDecorator(runCar);
flyCar.show();
System.out.println("-----------------------原始车装饰添加功能飞");
CarDecorator swimCar = new SwimCarDecorator(runCar);
swimCar.show();
System.out.println("-----------------------原始车装饰添加功能游");
CarDecorator swimFlyCar = new SwimCarDecorator(flyCar);
swimFlyCar.show();
System.out.println("-----------------------会飞车装饰添加功能游");
}
}
运行结果