一、什么是装饰模式
装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,
是继承关系的一个替换方案。
二、装饰模式的结构
一环套一环!
继承、关联(传参)
三、装饰模式的角色和职责
1)抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口。
2)具体组件角色:为抽象组件的实现类。
3)抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口。
4)具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰
四、代码示例实现
目标:车可以具有跑的功能,若要实现飞和游泳的功能,可以采用传统的方法继承或者接口来实现
现在想使用装饰模式来实现该功能。
1.car接口类(基本(抽象)组件)
public interface Car { public abstract void run(); public abstract void show(); }
2.可以跑得车类Runcar(具体组件角色)
public class RunCar implements com.dzg.learn.decorator.Car {//有两个同名的接口,引起了冲突 @Override public void run() { System.out.println("可以跑"); } @Override public void show() { this.run(); } }
3.可以飞的车(抽象类装饰角色),实现了Car接口
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.可以游泳的车(抽象类装饰角色)
public class SwimCarDecorator extends CarDecorator { public SwimCarDecorator(Car car) { super(car); } @Override public void run() { } public void swim(){ System.out.println("可以游泳"); } @Override public void show() { this.getCar().show(); //this.show();傻屌,这你也敢!!!死循环了啊。。。。。。。 this.swim(); } }
测试 public class TestDecorator { public static void main(String[] args) { // CarDecorator carDecorator = new CarDecorator();抽象类不能实例化 Car car = new RunCar();//接口Car有两个,引起了冲突 car.show(); System.out.println("=============================="); FlyCarDecorator flyCarDecorator = new FlyCarDecorator(car);//传递的参数是基础的car,具体的装饰角色 flyCarDecorator.show(); System.out.println("=============================="); SwimCarDecorator swimCarDecorator = new SwimCarDecorator(flyCarDecorator);//实现跑、飞、游的功能,具体的装饰角色 swimCarDecorator.show(); } }
测试结果:
可以跑
==============================
可以跑
可以飞
==============================
可以跑
可以飞
可以游泳
总结:装饰模式的使用,可以作为类之间继承的替换