相关链接:
【设计模式】专栏:【设计模式】专栏
相关例子可下载: Java常用设计模式例子
装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
意图
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
优点
-
装饰类和被装饰类可以独立发展,不会相互耦合。
-
装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
-
装饰器模式完全遵守开闭原则
缺点
-
装饰器模式会增加许多子类,过度使用会增加程序的复杂性
装饰器的角色
装饰器模式主要包含以下角色:
抽象构件(Component)角色
定义一个抽象接口,以规范准备接收附加责任的对象。
具体构件(Concrete Component)角色
实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色
继承抽象构件(Component),并包含具体构件(Concrete Component)的实例,可以通过其子类扩展具体构件的功能。
具体装饰(Concrete Decorator)角色
实现抽象装饰的(Decorator)的相关方法,并给具体构件(Concrete Component)对象添加附加的责任。
示例代码
抽象构件
/**
* 装饰器模式——抽象构件
*
* (奶茶)
*
*/
public interface Milkytea {
/**
* 添加配料
*/
public void addIngredients();
}
具体构建
/**
* 装饰器模式——具体构件
*
* (烧仙草)
*
*/
public class GrassJelly implements Milkytea{
@Override
public void addIngredients() {
System.out.println("烧仙草");
}
}
抽象装饰
/**
* 装饰器模式——抽象装饰
*
* (配料)
*
*/
public abstract class Ingredients implements Milkytea{
// 创建奶茶对象
protected Milkytea milkytea;
/**
* 构造函数——指定某杯奶茶
* @param milkytea
*/
public Ingredients(Milkytea milkytea) {
this.milkytea = milkytea;
}
/**
* 给奶茶添加配料
*/
@Override
public void addIngredients() {
this.milkytea.addIngredients();
}
}
具体装饰
/**
* 装饰器模式——具体装饰
*
* (珍珠)
*
*/
public class Pearl extends Ingredients{
/**
* 构造函数——指定某杯奶茶
*
* @param milkytea
*/
public Pearl(Milkytea milkytea) {
super(milkytea);
}
@Override
public void addIngredients() {
super.addIngredients();
System.out.println("加珍珠");
}
}
/**
* 装饰器模式——具体装饰
*
* (花生)
*
*/
public class Peanut extends Ingredients{
/**
* 构造函数——指定某杯奶茶
*
* @param milkytea
*/
public Peanut(Milkytea milkytea) {
super(milkytea);
}
@Override
public void addIngredients() {
super.addIngredients();
System.out.println("加花生");
}
}
测试类
/**
* 装饰器模式
*
*/
public class DecoratorPatternDemo {
public static void main(String[] args) {
// 构建一杯烧仙草
GrassJelly grassJelly = new GrassJelly();
// 构建珍珠配料,并指定添加到烧仙草
Pearl pearl = new Pearl(grassJelly);
// 构建花生配料,并指定添加到已加珍珠的烧仙草
Peanut peanut = new Peanut(pearl);
// 添加配料
peanut.addIngredients();
}
}
结束语
1、更多设计模式内容请看【设计模式】专栏
2、相关例子代码可下载: Java常用设计模式例子
PS: 【 Java常用设计模式例子 】 内已包含 【设计模式】专栏 里所涉及的代码,需要代码的同学可以下载哦,如果之前已下载过的同学,就不需要重复下载啦~
以上内容如有不正确或需要补充的地方,还请多多请教,会及时更新改正~
欢迎评论~ 感谢点赞~