装饰者模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
概述
对类增加功能时,不使用继承,而是使用组合的方式进行类的扩展。装饰模式动态将扩展功能附加到对象上,提供了比继承更有弹性的替代方案。
作用
在不修改类代码的情况下,实现类的扩展,即类对扩展开放,对修改关闭。
优势
可以避免因继承而产生的类过多的问题,这种设计在同一个类体系下非常有效。
格式
需要扩展功能时,只需要设计一个扩展类,该类将原有的类对象作为参数引入,并加以功能的扩展即可。而利用多态特性,可以支持同一个类体系下所有类对象的装饰。
装饰模式与继承的区别
- 装饰模式比继承要灵活,避免了继承体系的臃肿。
- 装饰类因为增强已有类,只是在原有功能上进行扩展,所以装饰类和被装饰的类通常都是属于一个体系。
- 类间关系:前者组合关系,后者继承关系。
- 继承适用范围更广,而装饰模式更加灵活。
举个例子吧:
假如说你要找一个男票,你会有很多要求,例如喜欢高、富、帅,喜欢聪明的、喜欢成熟的、喜欢嫩的,各种要求都可能出现......
现在如果你已经有了一个啥都不会的普通男票,你想把他定制成什么样呢?让我们用代码来看一下.
/**
* -->接口
* 朋友
*
*/
public interface Friend {
public String description();
public Double price();
}
/**
*
*一只啥也不会的男朋友
*
*/
public class BF implements Friend {
@Override
public String description() {
// TODO Auto-generated method stub
return "一只啥都不会的男票";
}
@Override
public Double price() {
// TODO Auto-generated method stub
return 0.001;
}
}
/**
* 男朋友属性拓展类,
* 前提拓展之前它也必须是一只男朋友
*
*/
public class Decorator implements Friend{
private Friend friend;
public Decorator(Friend friend) {
// TODO Auto-generated constructor stub
this.friend=friend;
}
@Override
public String description() {
// TODO Auto-generated method stub
return friend.description();
}
@Override
public Double price() {
// TODO Auto-generated method stub
return friend.price();
}
}
/**
*
* +帅气属性男朋友
*
*/
public class HandsomeDecorator extends Decorator{
public HandsomeDecorator(Friend friend) {
super(friend);
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"+帅气属性";
}
@Override
public Double price() {
// TODO Auto-generated method stub
return super.price()+100;
}
}
/**
*
* +聪明属性男朋友
*
*/
public class CleverDecorator extends Decorator {
public CleverDecorator(Friend friend) {
super(friend);
// TODO Auto-generated constructor stub
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"+聪明属性";
}
@Override
public Double price() {
// TODO Auto-generated method stub
return super.price()+100;
}
}
public class Test {
public static void main(String[] args) {
//创建一个男朋友对象
BF bf=new BF();
HandsomeDecorator handsome=new HandsomeDecorator(bf);
System.out.println("您定制了"+handsome.description()+",您可以带他出去溜溜了!");
System.out.println("您需要支付:"+handsome.price()+"元");
}
}