装饰器模式Decorator

简介: 煎饼果子装饰器&汽车装饰器

在之前的一次面试中,有被问到,“IO流中用到了什么设计模式?你知道这种设计模式具体怎么实现的吗?”。知道是装饰器模式,但那会没有去了解是怎么具体实现的。

下面对这个设计模式做一下简单的总结。


一、概述

所谓装饰器模式,就是在不改变原有对象的基础之上,去动态的将功能附加到对象之上,提供了比继承更有弹性的替代方法


这种设计模式有利也有弊:

  • 使功能扩展更加方便
  • 创建很多类

二、组件

装饰器模式(Decorator)中的组件

  • 抽象组件(Component)  

定义一个抽象类或接口以规范准备接收附加责任的对象

下面煎饼果子例子中的BatterCake

  • 具体组件(Concrete Component)

实现抽象构件,通过装饰角色为其添加一些职责

下面煎饼果子例子中的基础煎饼果子BaseBatterCake

  • 装饰器(Decorator)

继承或实现抽象组件,并包含具体组件的实例,可以通过具体装饰器扩展具体组件的功能

下面煎饼果子例子中的BatterCakeDecorator

  • 具体装饰器(Cncrete Decorator)

实现装饰器的相关方法,并给出具体组件对象添加附加的责任

下面煎饼果子例子中的EggDecorator、SausageDecorator

三、煎饼果子装饰器实现

以我们生活中都吃过的煎饼果子为例

我们平常所吃的煎饼果子,组合繁多,有加鸡蛋的、有加香肠的、有加生菜的,等等

3.1 抽象组件BetterCake

/*** 煎饼果子*/publicinterfaceBetterCake {
StringgetMsg();
intgetPrice();
}

3.2 具体组件BaseBetterCake

/*** 基础的煎饼果子*/publicclassBaseBetterCakeimplementsBetterCake {
@OverridepublicStringgetMsg() {
return"煎饼";
    }
@OverridepublicintgetPrice() {
return5;
    }
}

3.3 装饰器BatterCakeDecorator

/*** 装饰器*/publicclassBatterCakeDecoratorimplementsBetterCake {
privatefinalBetterCakebetterCake;
publicBatterCakeDecorator(BetterCakebetterCake) {
this.betterCake=betterCake;
    }
@OverridepublicStringgetMsg() {
returnthis.betterCake.getMsg();
    }
@OverridepublicintgetPrice() {
returnthis.betterCake.getPrice();
    }
}

3.4 具体装饰器

具体的装饰器,这里只有加鸡蛋的煎饼果子EggDecorator、加香肠的建斌果子SausageDecorator

其他类型的煎饼果子,可以再去继承装饰器

3.4.1 EggDecorator
/*** 具体装饰器(鸡蛋煎饼果子)*/publicclassEggDecoratorextendsBatterCakeDecorator {
publicEggDecorator(BetterCakebetterCake) {
super(betterCake);
    }
@OverridepublicStringgetMsg() {
returnsuper.getMsg() +"加1个鸡蛋";
    }
@OverridepublicintgetPrice() {
returnsuper.getPrice() +1;
    }
}
3.4.2 SausageDecorator
/*** 具体装饰器(香肠煎饼果子)*/publicclassSausageDecoratorextendsBatterCakeDecorator {
publicSausageDecorator(BetterCakebetterCake) {
super(betterCake);
    }
@OverridepublicStringgetMsg() {
returnsuper.getMsg() +"加1根香肠";
    }
@OverridepublicintgetPrice() {
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 类图

BaseBetterCake.jpg

四、汽车装饰器实现

4.1 汽车组件Car

publicinterfaceCar {
/*** 汽车的驾驶功能*/voidrun();
}

4.2 具体组件

4.2.1 宝马
publicclassBmwCarimplementsCar {
@Overridepublicvoidrun() {
System.out.println("宝马开车了。。。");
    }
}
4.2.2 奔驰
publicclassBenzCarimplementsCar {
@Overridepublicvoidrun() {
System.out.println("奔驰开车了。。。");
    }
}
4.2.3 特斯拉
publicclassTeslaCarimplementsCar {
@Overridepublicvoidrun() {
System.out.println("特斯拉开车了。。。");
    }
}

4.3 装饰器CarDecorator

publicclassCarDecoratorimplementsCar {
protectedCardecorated;
publicCarDecorator(Cardecorated) {
this.decorated=decorated;
    }
@Overridepublicvoidrun() {
decorated.run();
    }
}

4.4 具体装饰器

4.4.1 自动驾驶汽车
publicclassAutoCarDecoratorextendsCarDecorator {
publicAutoCarDecorator(Cardecorated) {
super(decorated);
    }
@Overridepublicvoidrun() {
super.run();
autoRun();
    }
privatevoidautoRun() {
System.out.println("开启自动驾驶");
    }
}
4.4.2 会飞的汽车
publicclassFlyCarDecoratorextendsCarDecorator {
publicFlyCarDecorator(Cardecorated) {
super(decorated);
    }
@Overridepublicvoidrun() {
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 类图

AutoCarDecorator.jpg

目录
相关文章
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
32 0
|
7月前
|
设计模式
设计模式之装饰器 Decorator
设计模式之装饰器 Decorator
52 1
|
设计模式 Java
Java设计模式-装饰器模式(Decorator)
Java设计模式-装饰器模式(Decorator)
结构型模式 - 装饰器模式(Decorator Pattern)
结构型模式 - 装饰器模式(Decorator Pattern)
|
设计模式
装饰模式(Decorator)
装饰模式(Decorator)
|
设计模式 uml
设计模式——装饰模式(Decorator)
设计模式——装饰模式(Decorator)
154 0
设计模式——装饰模式(Decorator)
|
设计模式 Java 数据库连接
【Java设计模式系列】装饰器模式(Decorator Pattern)(下)
【Java设计模式系列】装饰器模式(Decorator Pattern)
132 0
【Java设计模式系列】装饰器模式(Decorator Pattern)(下)
|
设计模式 Java
【Java设计模式系列】装饰器模式(Decorator Pattern)(上)
【Java设计模式系列】装饰器模式(Decorator Pattern)
145 0
【Java设计模式系列】装饰器模式(Decorator Pattern)(上)
|
设计模式 缓存 Java
结构型-Decorator
装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。
102 0
|
设计模式 Java
浅谈JAVA设计模式之——装饰模式(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
159 0
浅谈JAVA设计模式之——装饰模式(Decorator)