版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
概述
装饰模式定义:动态地给一个对象添加额外的职责和功能。也就是说:我们可以在不使用继承、不改变原有结构的基础上扩展新的内容。举个例子,我们都担心摔碎手机屏幕,所以我们可以在手机的外表面裹一层材料(比如钢化膜,手机套)从而使得手机具有了抗摔的新功能;并且手机原本的功能(打电话,拍照,上网)并没有受到任何影响。嗯哼,看完这个小例子,我们来瞅瞅装饰模式中的四个角色:
- Component:被装饰的原始抽象(类或接口)组件
- ConcreteComponent:Component的具体实现类
- Decorator:抽象装饰者
- ConcreteDecorator:Decorator的具体实现类
示例
在此,以生活中熟悉的奶茶的例子阐述装饰模式。
抽象奶茶类
package com.decoratorPattern02;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public abstract class AbstractMilkTea {
public abstract String descript();
public abstract double getPrice();
}
抽象奶茶类的子类
package com.decoratorPattern02;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public class MilkTea extends AbstractMilkTea {
@Override
public String descript() {
String string = "美味的奶茶。";
return string;
}
@Override
public double getPrice() {
double price = 6;
return price;
}
}
要点概述:
- 1、该子类继承自AbstractMilkTea
- 2、该子类不是抽象的
- 3、在子类中重写父类的方法
抽象装饰者
package com.decoratorPattern02;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public abstract class AbstractDecorator extends AbstractMilkTea {
//AbstractMilkTea类型的成员变量
private AbstractMilkTea abstractMilkTea;
public AbstractDecorator() {
}
public AbstractDecorator(AbstractMilkTea abstractMilkTea) {
this.abstractMilkTea = abstractMilkTea;
}
@Override
public String descript() {
return abstractMilkTea.descript();
}
@Override
public double getPrice() {
return abstractMilkTea.getPrice();
}
}
要点概述:
- 1、该为实抽象类
- 2、该抽象类继承自AbstractMilkTea
- 3、该类有参构造函数参数为AbstractMilkTea类型
- 4、在该类中以成员变量的形式持有了AbstractMilkTea
- 5、在该类中重写父类AbstractMilkTea的方法
抽象装饰者的子类
package com.decoratorPattern02;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public class SugarDecorator extends AbstractDecorator {
public SugarDecorator() {
}
public SugarDecorator(AbstractMilkTea abstractMilkTea) {
super(abstractMilkTea);
}
@Override
public String descript() {
return super.descript()+"加糖";
}
@Override
public double getPrice() {
return super.getPrice()+1;
}
}
要点概述:
- 1、该类继承自AbstractDecorator
- 2、该类有参构造函数参数为AbstractMilkTea类型
- 3、在该类中重写父类AbstractDecorator的方法
抽象装饰者的子类
package com.decoratorPattern02;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public class RedBeanDecorator extends AbstractDecorator {
public RedBeanDecorator() {
}
public RedBeanDecorator(AbstractMilkTea abstractMilkTea) {
super(abstractMilkTea);
}
@Override
public String descript() {
return super.descript() + "加红豆";
}
@Override
public double getPrice() {
return super.getPrice() + 2;
}
}
要点概述:
- 1、该类继承自AbstractDecorator
- 2、该类有参构造函数参数为AbstractMilkTea类型
- 3、在该类中重写父类AbstractDecorator的方法
测试
package com.decoratorPattern02;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public class Test {
public static void main(String[] args) {
MilkTea milkTea = new MilkTea();
System.out.println(milkTea.descript());
System.out.println(milkTea.getPrice());
SugarDecorator sugarDecorator = new SugarDecorator(milkTea);
System.out.println(sugarDecorator.descript());
System.out.println(sugarDecorator.getPrice());
RedBeanDecorator redBeanDecorator = new RedBeanDecorator(milkTea);
System.out.println(redBeanDecorator.descript());
System.out.println(redBeanDecorator.getPrice());
}
}