点击上方“小强的进阶之路”,选择“置顶或者星标” 你关注的就是我关心的!
预计阅读时间:8分钟
装饰模式 Decorator Pattern
使用到装饰模式的情况,关键之处就是在于装饰两字,翻译过来就是需要为一个类或者对象添加额外的功能,而且这个功能可能是出于特定的情况之下才会需要的。
所以通过装饰模式把每个要装饰的功能放在单独的类中,并让这个类装饰需要这个功能的被装饰对象,于是在处于特定情况之下要执行这个特殊的功能的时候,客户端只需要有选择地,按照需要的顺序使用装饰功能包装对象即可。
可以使用到装饰模式的案例在日常生活中会有很多,比如我们自己每天的日常搭配,穿什么类型的上衣,下装和鞋子,上班期间有着自己的小西装加上小皮鞋,休假期间一套休闲装加休闲鞋,晚会或者酒会更是需要盛装出席不仅仅需要穿衣还需要搭配不少小饰品比如手表或者项链等等。
衣服和饰品即是对"人"这个具体对象的装饰,这也是日常生活中可以使用到装饰模式的小例子,这一次的案例以另一个生活常见的例子为例。
情景:不管什么时候我们都是需要喝水的,类似于星巴克这种高级咖啡店或者去街边的小奶茶店,点上那么一杯奶茶,但是仅仅是一杯奶茶最后得到只能是原味奶茶,
于是我们需要给奶茶前加各种修饰例如珍珠奶茶,椰果奶茶,蓝莓奶茶等等,这不就是对"奶茶"进行了装饰吗? 接下来就可以开始编写这个小例子啦!
UML类图
/**
* 装饰模式案例 抽象构件角色 奶茶店接口定义
* @author WQ
*/
public interface MilkTeaShop {
void show();
}
/**
* 装饰模式 具体构件角色 奶茶类定义
* @author WQ
*/
public class MilkyTea implements MilkTeaShop{
@Override
public void show() {
System.out.println("奶茶一杯!");
}
}
/**
* 装饰模式 装饰角色 装饰类定义 注意该类需要维护和持有一个抽象构件的引用
* @author WQ
*/
public class Decorator implements MilkTeaShop{
protected MilkTeaShop shop = null;
//开始构造 也就是装饰
public void Decorate(MilkTeaShop shop){
this.shop = shop;
}
@Override
public void show() {
if (shop != null){
shop.show();
}
}
}
/**
* 装饰模式 具体装饰角色 冰块类定义
* @author WQ
*/
public class Ice extends Decorator{
@Override
public void show() {
System.out.print("加冰的,");
shop.show();
}
}
-------------------------------------------------------------------------------
/**
* 装饰模式 具体装饰角色 椰果类定义
* @author WQ
*/
public class Coconuts extends Decorator{
@Override
public void show() {
System.out.print("加椰果的,");
shop.show();
}
}
-------------------------------------------------------------------------------
/**
* 装饰模式 具体装饰角色 椰果类定义
* @author WQ
*/
public class Suger extends Decorator{
@Override
public void show() {
System.out.print("加糖的,");
shop.show();
}
}
/**
* 装饰模式案例测试类
* @author WQ
*/
public class Test {
public static void main(String[] args){
MilkTeaShop shop = new MilkyTea();
Ice ice = new Ice();
Coconuts coconuts = new Coconuts();
Suger suger = new Suger();
System.out.println("没有配置:");
shop.show();
System.out.println("第一种配置:");
ice.Decorate(shop);
coconuts.Decorate(ice);
coconuts.show();
System.out.println("第二种配置:");
ice.Decorate(shop);
suger.Decorate(ice);
suger.show();
System.out.println("第三种配置:");
suger.Decorate(shop);
coconuts.Decorate(suger);
ice.Decorate(coconuts);
ice.show();
}
}
测试结果
装饰模式的案例完成!!装饰模式的介绍也结束啦!但是这个案例中的奶茶店的抽象接口其实可以直接变成奶茶类,而使装饰类继承奶茶类即可!
同时实际情况是可以进行对装饰模式进行简化的:
已保存!
End
【关注】和【转发】是对小强最大的支持!!!
本文分享自 MoziInnovations 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!