装饰模式
概念:
动态的为一些对象添加额外的职责;
类图如下:
应用场景:
- 需要扩展一个类的功能,给业务逻辑添加附加职责;
- 动态的为对象添加功能,添加的功能可以在后期动态的删除;
- 需要增加由一些功能排列组合而产生的大量代码,从而使得继承很难实现;
- 为类功能实现扩展,但是同时会造成大量子类的场景;
- 可以使用模版方法模式、责任链实现,但是功能各个子类功能相互独立,模版方法以及责任链的顺序不同;
优点:
- 实现了客户端的分离;
- 把类中的装饰功能从类中搬移去除,简化了原有的类;
- 为不同功能子类装饰不同的顺序,可以产生不同的产品(完成了不同的业务处理);
举例说明:
依据装饰模式的类图,个人比较喜欢使用抽象类作为基类(Component),但是在具体的项目中,请依据项目的特性进行选择--》例如,若项目使用了spring,装饰类作为被注入到其他类中的对象,请使用接口后者普通的类(抽象类无法实例化,因此不能作为Bean处理);
例子:用蛋糕店中生产生日蛋糕为例--》基础蛋糕制作出来之后,需要为蛋糕添加装饰品,以及为蛋糕进行必要的包装;
- 装饰基类--》COMPONENT
package main.dxb.decorator;
/**
* 装饰者模式的组建类
* <p>
* 定义一个对象的公共接口,可以为这些对象动态的添加职责
* <p>
*
* @author Administrator
* @version [V1.00, 2014-10-8]
* @see [相关类/方法]
* @since V1.00
*/
public abstract class Component
{
/**
* 对象的具体操作
*/
public abstract void operator();
}
- 装饰继承类--》DECORATOR
package main.dxb.decorator;
/**
* 装饰的对象
* <p>
* 装饰的基类,在装饰者模式中充当的是装饰的角色
* <p>
*
* @author Administrator
*
*/
public class CakeDecorator extends Component
{
/**
* 在装饰者模式中充当的是被装饰的对象
*/
private Component component;
@Override
public void operator()
{
component.operator();
}
public void setComponent(Component _component)
{
component = _component;
}
}
- 蛋糕的基类--》CAKE
package main.dxb.decorator;
/**
* 具体类
* <p>
* 该类继承组件类,可以给对象添加一定的职责
* <p>
*
* @author Administrator
* @version [V1.00, 2014-10-8]
* @see [相关类/方法]
* @since V1.00
*/
public class Cake extends Component
{
private InnerCake innerCake;
public Cake(String _name, String _price)
{
if (innerCake == null)
{
innerCake = new InnerCake();
// 为蛋糕实体添加固有的属性
innerCake.setName(_name);
innerCake.setPrice(_price);
}
}
@Override
public void operator()
{
innerCake.print();
}
/**
* 为实现多继承添加的成员内部类
*
* @author Administrator
*
*/
private class InnerCake extends CakeEntity
{
public void print()
{
System.out.println("蛋糕的名称为:" + super.getName());
System.out.println("蛋糕的价格为:" + super.getPrice());
System.out.println("******************************");
}
}
}
- 蛋糕的实体类--》CakeEntity
package main.dxb.decorator;
/**
* @author Administrator
* 蛋糕的实体类
*/
public class CakeEntity
{
private String name;
private String price;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPrice()
{
return price;
}
public void setPrice(String price)
{
this.price = price;
}
}
- 巧克力蛋糕实体
package main.dxb.decorator;
/**
* 巧克力类--具体对象的一个子类
*
* @author Administrator
*
*/
public class ChocolateCake extends Cake
{
public ChocolateCake(String _name, String _price)
{
super(_name, _price);
}
@Override
public void operator()
{
super.operator();
}
}
- 冰欺凌蛋糕
package main.dxb.decorator;
/**
* 巧克力类--具体对象的一个子类
*
* @author Administrator
*
*/
public class ChocolateCake extends Cake
{
public ChocolateCake(String _name, String _price)
{
super(_name, _price);
}
@Override
public void operator()
{
super.operator();
}
}
- 盒子装饰类
package main.dxb.decorator;
public class BoxDecorator extends CakeDecorator
{
@Override
public void operator()
{
super.operator();
// 添加装饰
addDecorator();
}
public void addDecorator()
{
System.out.println("添加盒子");
}
}
- 花装饰类
package main.dxb.decorator;
public class FlowerDecorator extends CakeDecorator
{
@Override
public void operator()
{
super.operator();
// 添加装饰的内容
addDecorator();
}
public void addDecorator()
{
System.out.println("添加花");
}
}
public static void main(String[] args)
{
Cake chocolateCake = new ChocolateCake("巧克力蛋糕", "15元");
Cake iceCake = new IceCake("冰欺凌蛋糕", "20元");
CakeDecorator flowerDecorator=new FlowerDecorator();
CakeDecorator boxDecorator =new BoxDecorator();
flowerDecorator.setComponent(iceCake);
boxDecorator.setComponent(flowerDecorator);
boxDecorator.operator();
System.out.println("----------------------------------");
flowerDecorator.setComponent(chocolateCake);
boxDecorator.setComponent(flowerDecorator);
boxDecorator.operator();
}