在之前的一次面试中,有被问到,“IO流中用到了什么设计模式?你知道这种设计模式具体怎么实现的吗?”。知道是装饰器模式,但那会没有去了解是怎么具体实现的。
下面对这个设计模式做一下简单的总结。
一、概述
所谓装饰器模式,就是在不改变原有对象的基础之上,去动态的将功能附加到对象之上,提供了比继承更有弹性的替代方法
这种设计模式有利也有弊:
- 使功能扩展更加方便
- 创建很多类
二、组件
装饰器模式(Decorator)中的组件
- 抽象组件(Component)
定义一个抽象类或接口以规范准备接收附加责任的对象
下面煎饼果子例子中的
BatterCake
- 具体组件(Concrete Component)
实现抽象构件,通过装饰角色为其添加一些职责
下面煎饼果子例子中的基础煎饼果子
BaseBatterCake
- 装饰器(Decorator)
继承或实现抽象组件,并包含具体组件的实例,可以通过具体装饰器扩展具体组件的功能
下面煎饼果子例子中的
BatterCakeDecorator
- 具体装饰器(Cncrete Decorator)
实现装饰器的相关方法,并给出具体组件对象添加附加的责任
下面煎饼果子例子中的
EggDecorator、SausageDecorator
三、煎饼果子装饰器实现
以我们生活中都吃过的煎饼果子为例
我们平常所吃的煎饼果子,组合繁多,有加鸡蛋的、有加香肠的、有加生菜的,等等
3.1 抽象组件BetterCake
/*** 煎饼果子*/publicinterfaceBetterCake { StringgetMsg(); intgetPrice(); }
3.2 具体组件BaseBetterCake
/*** 基础的煎饼果子*/publicclassBaseBetterCakeimplementsBetterCake { publicStringgetMsg() { return"煎饼"; } publicintgetPrice() { return5; } }
3.3 装饰器BatterCakeDecorator
/*** 装饰器*/publicclassBatterCakeDecoratorimplementsBetterCake { privatefinalBetterCakebetterCake; publicBatterCakeDecorator(BetterCakebetterCake) { this.betterCake=betterCake; } publicStringgetMsg() { returnthis.betterCake.getMsg(); } publicintgetPrice() { returnthis.betterCake.getPrice(); } }
3.4 具体装饰器
具体的装饰器,这里只有加鸡蛋的煎饼果子EggDecorator、加香肠的建斌果子SausageDecorator
其他类型的煎饼果子,可以再去继承装饰器
3.4.1 EggDecorator
/*** 具体装饰器(鸡蛋煎饼果子)*/publicclassEggDecoratorextendsBatterCakeDecorator { publicEggDecorator(BetterCakebetterCake) { super(betterCake); } publicStringgetMsg() { returnsuper.getMsg() +"加1个鸡蛋"; } publicintgetPrice() { returnsuper.getPrice() +1; } }
3.4.2 SausageDecorator
/*** 具体装饰器(香肠煎饼果子)*/publicclassSausageDecoratorextendsBatterCakeDecorator { publicSausageDecorator(BetterCakebetterCake) { super(betterCake); } publicStringgetMsg() { returnsuper.getMsg() +"加1根香肠"; } publicintgetPrice() { returnsuper.getPrice() +2; } }
3.5 测试类
/*** 煎饼果子测试类*/publicclassBetterCakeTest { publicstaticvoidmain(String[] args) { BetterCakebetterCake; betterCake=newBaseBetterCake(); System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元"); // 煎饼加鸡蛋betterCake=newEggDecorator(betterCake); System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元"); // 煎饼再加鸡蛋betterCake=newEggDecorator(betterCake); System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元"); // 煎饼加香肠betterCake=newSausageDecorator(betterCake); System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元"); } }
3.5.1 执行结果
煎饼,售价:5元 煎饼加1个鸡蛋,售价:6元 煎饼加1个鸡蛋加1个鸡蛋,售价:7元 煎饼加1个鸡蛋加1个鸡蛋加1根香肠,售价:9元
3.6 类图
四、汽车装饰器实现
4.1 汽车组件Car
publicinterfaceCar { /*** 汽车的驾驶功能*/voidrun(); }
4.2 具体组件
4.2.1 宝马
publicclassBmwCarimplementsCar { publicvoidrun() { System.out.println("宝马开车了。。。"); } }
4.2.2 奔驰
publicclassBenzCarimplementsCar { publicvoidrun() { System.out.println("奔驰开车了。。。"); } }
4.2.3 特斯拉
publicclassTeslaCarimplementsCar { publicvoidrun() { System.out.println("特斯拉开车了。。。"); } }
4.3 装饰器CarDecorator
publicclassCarDecoratorimplementsCar { protectedCardecorated; publicCarDecorator(Cardecorated) { this.decorated=decorated; } publicvoidrun() { decorated.run(); } }
4.4 具体装饰器
4.4.1 自动驾驶汽车
publicclassAutoCarDecoratorextendsCarDecorator { publicAutoCarDecorator(Cardecorated) { super(decorated); } publicvoidrun() { super.run(); autoRun(); } privatevoidautoRun() { System.out.println("开启自动驾驶"); } }
4.4.2 会飞的汽车
publicclassFlyCarDecoratorextendsCarDecorator { publicFlyCarDecorator(Cardecorated) { super(decorated); } publicvoidrun() { super.run(); fly(); } privatevoidfly() { System.out.println("开启飞行汽车模式"); } }
4.5 测试类
publicclassCarTest { publicstaticvoidmain(String[] args) { CarbenzCar=newBenzCar(); CarbmwCar=newBmwCar(); CarteslaCar=newTeslaCar(); // 创建自动驾驶的奔驰汽车CarDecoratorautoBenzCar=newAutoCarDecorator(benzCar); // 创建飞行的、自动驾驶的宝马汽车CarDecoratorflyAutoBmwCar=newFlyCarDecorator(newAutoCarDecorator(bmwCar)); benzCar.run(); bmwCar.run(); teslaCar.run(); System.out.println(); autoBenzCar.run(); System.out.println(); flyAutoBmwCar.run(); } }
4.5.1 执行结果
奔驰开车了。。。 宝马开车了。。。 特斯拉开车了。。。 奔驰开车了。。。 开启自动驾驶 宝马开车了。。。 开启自动驾驶 开启飞行汽车模式
4.6 类图