装饰者模式

Posted ShouldStrong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰者模式相关的知识,希望对你有一定的参考价值。

我编写了如下代码希望能对大家理解装饰者有更好的帮助
public interface Car {
    void run();// 车跑的方法
    void stop();//停车
    int oilTank();//油箱大小
    void driver(String driverName);//谁开的
    
}

//一辆QQ车
public class QQ implements Car{

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("qq完成百公里加速");
        } catch (Exception e) {
        }
    }

    @Override
    public void stop() {
        System.out.println("qq刹车了");
    }

    @Override
    public int oilTank() {
        return 50;
    }

    @Override
    public void driver(String driverName) {
        System.out.println(driverName+"正在驾驶qq");
    }
}
我们在这里做个测试类 


public class CarTest {
    public static void main(String[] args) {
        QQ qq = new QQ();
        qq.run();

//输出QQ完成百公里加速

//那么我想要QQ车增加一些其他功能 比如百公里加速的时间  加个 汽车尾翼等
    }
}

接下来我要再定义一个QQWrapper 类实现Car接口在加上QQ车百公里加速的功能

public class QQWrapper implements Car {
    private Car qq;

加强对象持有原有对象的引用
    
    public QQWrapper(Car qq) {
        super();
        this.qq = qq;
    }

    @Override
    public void run() {
        long start = System.currentTimeMillis();
        qq.run();
        long end = System.currentTimeMillis();
        System.out.println("百公里加速用时"+(end-start));

  需要加强的方法 加强我需要的逻辑  

  不需要加强的方法 实现我原来的逻辑
    }

    @Override
    public void stop() {
        qq.stop();
    }

    @Override
    public int oilTank() {
        return qq.oilTank();
    }

    @Override
    public void driver(String driverName) {
        qq.driver(driverName);
    }

}

QQWrapper qqWrapper = new QQWrapper(qq);

把原有qq对象 给qqWrapper 让他跑一下
        qqWrapper.run();

//输出QQ完成百公里加速

百公里加速用时1001

以上是关于装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

装饰者模式

装饰者模式

设计模式装饰者模式

设计模式学习_装饰者模式

设计模式整理_装饰者模式

设计模式 - 装饰者模式详解