java设计模式——装饰者模式
装饰模式又名包装(Wrapper)模式。装饰者模式是对已经实现功能的扩展,在原有功能的基础上添加新的功能,用来解决子类爆炸问题。
- 抽象组件(Component)角色:一个抽象接口(如下文的Car类),是被装饰类和装饰类的父接口
- 具体组件(ConcreteComponent)角色:抽象组件的实现类(如下文的RunCar类,实现了Car接口里的run() 方法)
- 抽象装饰(Decorator)角色:持有一个组件(Component)对象的实例(如下文中的CarDecorator类),并申明一个与抽象组件接口一致的接口。
- *具体装饰(ConcreteDecorator)角色:抽象装饰角色的实现类,负责新增功能(如下文的FlyDecorator类,SwimDecorator类)
抽象组件
//抽象组件:汽车类
public interface Car {
//汽车的行驶方法
public void run();
}
抽象组件的具体实现
//汽车的具体实现:普通汽车就只会跑的那种
public class RunCar implements Car {
@Override
public void run() {
System.out.println("跑");
}
}
抽象装饰角色
//抽象装饰角色:车的装饰类
public class CarDecorator implements Car {
//持有抽象组件的具体实现对象,通过构造器注入
public Car car;
public CarDecorator(Car car) {
this.car = car;
}
public void run() {
car.run();
}
}
抽象装饰角色的具体实现——fly装饰
//具体装饰角色:比如让车飞起来 QQ飞车那种
public class FlyDecorator extends CarDecorator {
public FlyDecorator(Car car) {
super(car);
}
@Override
public void run() {
super.run();//调用父类的方法,也就是不改变原有的方法,并添加自己的功能
//自己添加的心功能
System.out.println("飞");
}
抽象装饰角色的具体实现——swim装饰
//具体装饰角色:比如让车会游泳
public class SwimDecorator extends CarDecorator {
public SwimDecorator(Car car) {
super(car);
}
@Override
public void run() {
super.run();
System.out.println("游");
}
}
测试方法
public class MainClass {
public static void main(String[] args) {
Car car = new RunCar();
car.run();
System.out.println("-------------------");
Car flyCar = new FlyDecorator(car);
flyCar.run();
System.out.println("-------------------");
Car swimCar = new SwimDecorator(car);
swimCar.run();
System.out.println("-------------------");
Car swimFlyCar=new SwimDecorator(new FlyDecorator(car));
swimFlyCar.run();
}
}
控制台输出结果
跑
-------------------
跑
飞
-------------------
跑
游
-------------------
跑
飞
游
Process finished with exit code 0
举个例子~java中的IO流就用到了装饰这模式
博主第一次写博客,写的不好~嘿嘿嘿
想看更详细的文章可以看看这个博主的