- * 装饰者设计模式的经典案例GoogleCar:需求:希望将GoogleCar的接入到生态圈平台,增强里面的相关功能
- * 使用场景:二次开发的时候,拿不到源码,无法使用继承条件下,要对已经存在对象上的功能进行增强
- * 前提:一定要拿到被装饰对象实现的所有接口
- * 实现:自定义实现一个装饰类,实现相关的接口,为自定义装饰类传入被装饰类的对象
- * 弊端:如果被实现的接口太多的话,装饰类中的方法过多冗余
- /**
- * @author NOT ME
- * @description 定义一个汽车接口规范
- * @create 2018/11/8 0008上午 10:58
- */
- public interface ICar {
- /**
- * @description 实现类只需要覆盖重写该该方法就可以启动汽车
- * @Date: 2018/11/8 0008 上午 10:58
- */
- void start();
- /**
- * @description 实现类只需要覆盖重写该方法就可以运行汽车
- * @Date: 2018/11/8 0008 上午 11:00
- */
- void run();
- /**
- * @description 实现类只需要覆盖重写该方法就可以停止汽车
- * @Date: 2018/11/8 0008 上午 11:01
- */
- void stop();
- }
- /**
- * @author NOT ME
- * @description GoogleCar类实现了ICar这个接口,覆盖重写了所有的方法,在方法里面定义了谷歌Car的一系列操作汽车的方法
- * 那么会把类设置成final类型,不能被其他的类继承,不能重写里面的方法,否则会造成隐患。
- * 只能拿到jar包,也就是编译过后的字节码文件。
- * @create 2018/11/8 0008上午 11:02
- */
- public final class GoogleCar implements ICar {
- @Override
- public void start() {
- System.out.println("汽车启动了");
- }
- @Override
- public void run() {
- System.out.println("汽车运行了");
- }
- @Override
- public void stop() {
- System.out.println("汽车停止了");
- }
- }
- /**
- * @author NOT ME
- * @description 定义一个MyCar类实现了ICar接口
- * @create 2018/11/8 0008上午 11:08
- */
- public class MyCar implements ICar {
- ICar car;
- /**
- * @description 在创建对象的同时,需要把GoogleCar的对象也传进来,通过GoogleCar的对象调用GoogleCar的方法
- * @Date: 2018/11/8 0008 上午 11:21
- */
- public MyCar(ICar car) {
- this.car = car;
- }
- @Override
- public void start() {
- // 下面两行代码是增强的方法
- System.out.println("今天天气良好");
- System.out.println("今天道路稍微有点堵塞,但是不影响通行");
- // 下面一行代码是GoogleCar的原方法,没有发生任何改变
- car.start();
- }
- @Override
- public void run() {
- car.run();
- }
- @Override
- public void stop() {
- car.stop();
- }
- }
复制代码 |
|